最直接方式是通过 composer.json 的 config.vendor-dir 设置相对路径,如 "lib/vendor",该配置被官方支持且优先级低于环境变量和 -d 参数,需确保父目录存在并更新代码中 autoload.php 的引用路径。

composer.json 里用 config.vendor-dir 指定路径最直接
这是官方支持且最稳妥的方式,修改后所有 composer install 和 composer update 都会把包装到新位置,无需额外命令或环境变量。
在项目根目录的 composer.json 中添加或修改 config 字段:
{
"config": {
"vendor-dir": "lib/vendor"
}
}
注意:vendor-dir 值必须是相对路径(不以 / 或 C:\\ 开头),且不能包含 .. 回退;它始终相对于 composer.json 所在目录解析。
- 如果设为
"vendor-dir": "vendor"(默认值),就等同于没改 - 设为
"vendor-dir": "third-party",则实际生成./third-party/ - 设为
"vendor-dir": "src/lib/vendor",需确保src/lib/目录存在或可被自动创建
运行时用 -d vendor-dir=xxx 临时覆盖(适合 CI 或调试)
这条命令行参数优先级高于 composer.json 里的配置,但只对当次执行生效,不持久化。
例如:
composer install -d vendor-dir=external/vendor
常见误用点:
-
-d是composer的全局选项,必须放在子命令(如install)之前,composer -d vendor-dir=xxx install才对;composer install -d vendor-dir=xxx会被忽略 - 路径不能带引号包裹(除非含空格),否则 Composer 会报错
Invalid config key 'vendor-dir=xxx' - 该方式不会自动创建父目录,若
external/不存在,会报错Could not create directory
通过 COMPOSER_VENDOR_DIR 环境变量控制(适合多项目统一管理)
这个环境变量优先级最高,会覆盖 composer.json 和 -d 参数。适合在 Docker、CI 脚本或开发机全局设置中使用。
Linux/macOS:
export COMPOSER_VENDOR_DIR="/opt/myproject-deps" composer install
Windows(CMD):
set COMPOSER_VENDOR_DIR=C:\deps composer install
关键限制:
- 环境变量值必须是绝对路径,相对路径会被忽略
- 如果路径不存在,Composer 不会自动创建,会直接失败
- PHP 的
getenv()受variables_order影响,某些 SAPI(如部分 Apache mod_php 配置)可能读不到该变量
autoload 自动加载不受影响,但 vendor/autoload.php 路径要同步更新
Composer 修改 vendor-dir 后,自动生成的 vendor/autoload.php 仍会写在新路径下,但你的代码里如果硬编码了 require 'vendor/autoload.php',就会出错。
正确做法是:始终用相对路径或动态定位
- 推荐写法:
require __DIR__ . '/vendor/autoload.php';→ 改成require __DIR__ . '/lib/vendor/autoload.php';(与composer.json中的vendor-dir一致) - 更健壮的做法:用
dirname((new \Composer\Autoload\ClassLoader())->getPrefixesPsr4())不现实;实际项目中建议统一用 Composer 自动生成的入口,或借助composer dump-autoload --optimize保证性能 - 如果你用的是框架(如 Laravel、Symfony),它们通常通过
autoload.php路径初始化自动加载器,只要入口文件 require 的路径对,其余都透明
真正容易漏掉的是:测试脚本、部署脚本、IDE 的 PHP Include Path、以及某些静态分析工具(如 PHPStan)可能仍按默认 vendor/ 查找依赖,需要手动同步配置。










