Composer不支持用composer config --global修改vendor目录,仅项目级composer.json的config.vendor-dir或环境变量COMPOSER_VENDOR_DIR有效;改配置后须手动删除旧vendor并重装依赖。

Composer 不提供 composer config 命令直接修改 vendor 目录位置——这是个常见误解。真正生效的方式只有两种:通过 composer.json 配置 config.vendor-dir,或使用环境变量 COMPOSER_VENDOR_DIR。其他所谓“全局 config 修改 vendor 路径”的操作,要么无效,要么只影响部分行为(比如插件安装),不改变实际依赖安装路径。
为什么 composer config --global vendor-dir 不起作用?
执行 composer config --global vendor-dir /path/to/vendor 确实会把键值写入全局 composer.json(通常在 ~/.composer/config.json),但 Composer **完全忽略该配置项**。官方文档明确说明:vendor-dir 是项目级配置,仅在项目根目录的 composer.json 中生效,--global 或 --system 作用域下设置会被静默跳过。
- 运行
composer config vendor-dir在项目中查不到值?说明没配,不是“继承自全局” - 即使全局 config 里出现了
"vendor-dir": "xxx",composer install仍用默认./vendor - Composer 源码中,
vendor-dir的读取逻辑限定在LocalRepository::getVendorDir(),只解析当前项目composer.json
正确设置项目级 vendor-dir 的方法
必须在项目根目录的 composer.json 中显式声明 config.vendor-dir,且需重新运行安装命令才会生效。注意:已存在的 vendor/ 不会自动迁移,需手动处理。
{
"name": "my/project",
"config": {
"vendor-dir": "lib/vendor"
}
}
- 修改后运行
composer install或composer update,依赖会装到lib/vendor - 若原
vendor/已存在,Composer 不会删除它,也不警告冲突——得自己rm -rf vendor - 路径支持相对路径(如
"lib/vendor")和绝对路径(如"/var/www/myapp/vendor"),但绝对路径会降低项目可移植性 - 该配置对
autoload自动加载也生效:Composer 生成的vendor/autoload.php会适配新路径
用 COMPOSER_VENDOR_DIR 环境变量临时覆盖(推荐用于 CI/CD)
这是最灵活、无需改代码的方式,尤其适合构建环境。它优先级高于 composer.json 中的 vendor-dir,且对当前 shell 会话或单条命令有效。
- Linux/macOS 下临时设置:
COMPOSER_VENDOR_DIR=/tmp/vendor composer install - CI 脚本中常用:
export COMPOSER_VENDOR_DIR=$HOME/.cache/composer/vendor && composer install - Windows PowerShell:
$env:COMPOSER_VENDOR_DIR="D:\build\vendor"; composer install - 注意:该变量只影响依赖安装路径,不影响
composer.json解析或插件行为;若同时设了config.vendor-dir和环境变量,以环境变量为准
真正要改 vendor 目录,就别碰 --global,老老实实改项目 composer.json 或设环境变量。最容易被忽略的是:改完配置后忘记删旧 vendor 目录,导致新旧依赖共存、自动加载混乱、甚至 class not found 错误。










