直接修改项目根目录 composer.json 的顶层 "vendor-dir" 字段即可,如 {"vendor-dir": "custom_composer"},需手动删除旧 vendor 目录后再执行 install/update,不支持全局配置、相对路径别名或环境变量。

直接改 composer.json 的 "vendor-dir" 就行,但得注意它只在当前项目生效,且不能用相对路径别名(比如 ~/ 或 $HOME)。
vendor-dir 设置位置和写法
必须写在项目根目录下的 composer.json 文件顶层,不是 config 子项里,也不是全局配置。写错位置是常见失败原因。
- ✅ 正确写法:
{"vendor-dir": "custom_composer"} - ❌ 错误写法:
{"config": {"vendor-dir": "custom_composer"}}(这是旧版写法,已废弃) - ❌ 错误写法:
{"vendor-dir": "./custom_composer"}(./会被忽略,实际仍按项目根目录解析) - 路径不支持环境变量或波浪号,
"vendor-dir": "$HOME/my-vendor"或"~/my-vendor"都无效
执行 install/update 前必须先删掉旧 vendor
Composer 不会自动移动已有 vendor 目录,改了 "vendor-dir" 后直接 composer install,它会新建目录,但旧 vendor 还在原处,容易引发 autoload 冲突或文件残留。
- 运行前先手动删掉原来的
vendor目录:rm -rf vendor - 再执行
composer install或composer update - 如果用了
autoload-dev或自定义 psr-4 映射,检查composer.json中的"autoload"是否仍指向正确路径(一般不用改,因为 autoload 是基于项目根目录解析的)
全局设置不生效,别白费劲
有人想在 ~/.composer/config.json 里加 "vendor-dir" 实现“所有项目统一路径”,这不行——Composer 明确不支持全局 vendor-dir 配置。
- 全局 config 只影响
cache-dir、bin-dir、github-oauth等选项 -
"vendor-dir"是项目级配置,必须每个项目单独设 - CI/CD 场景下,记得把新路径加入
.gitignore(如果原来没加),否则可能误提交空目录或冲突
真正麻烦的是多项目协作时路径不一致:有人本地设了 custom_composer,别人没设,composer.lock 里记录的依赖路径其实不受影响,但 IDE 自动导入、脚本硬编码 vendor/autoload.php 路径就容易崩——这种隐性耦合,比路径本身更难排查。










