默认 vendor 目录可通过 composer.json 的 "config": {"vendor-dir": "新路径"} 修改,改后需删除原 vendor 并重新运行 composer install 以重建 autoload 和 bin 链接。

composer install 默认装到 vendor 目录,怎么改?
composer install 本身不接受路径参数,它只认 vendor 这个硬编码目录。想换位置,得靠配置文件提前“打招呼”,不是靠命令行临时指定。改路径本质是告诉 Composer:“以后所有包都别往默认 vendor 放,换地方”。
- 修改项目根目录下的
composer.json,加"config"字段 - 必须用
"vendor-dir"键,值为相对路径(如"libs")或绝对路径(慎用) - 路径不能以
/开头(否则被当成绝对路径,Windows 下可能出错) - 改完必须删掉现有
vendor目录再跑composer install,否则旧包还在原地不动
{
"config": {
"vendor-dir": "third-party"
}
}为什么 vendor-dir 改了,autoload 还报错?
Composer 自动加载器(vendor/autoload.php)的路径是生成时写死的。你改了 vendor-dir,但没重新生成 autoload,PHP 还在找原来的 vendor/autoload.php。
- 运行
composer dump-autoload不够,它只刷新类映射,不改入口文件位置 - 必须执行
composer install或composer update,才会重建整个vendor结构和 autoload 入口 - 如果项目已上线,注意检查所有 require/require_once 对
vendor/autoload.php的引用,要同步改成新路径,比如third-party/autoload.php
全局改 vendor 路径靠谱吗?
可以,但不推荐。通过 composer config -g vendor-dir /path/to/global/vendor 设置全局 vendor-dir,会影响所有项目。
- 全局设置会被项目级
composer.json中的vendor-dir覆盖,优先级:项目 > 用户 > 全局 - 多人协作时,全局配置无法提交,容易导致本地行为不一致
- 某些 CI 环境(如 GitHub Actions)默认不读全局 config,改了也白改
- 更稳妥的做法是:每个项目自己配
vendor-dir,并提交到 git
改路径后,某些包的脚本或 bin 文件失效了?
是的。部分包在 composer.json 里写了 "bin" 字段(比如 phpunit、laravel-env),Composer 会把对应二进制文件软链到 vendor/bin。你改了 vendor-dir,但没改 bin-dir,链接就断了。
- 配置里要同步加
"bin-dir",且值需匹配新 vendor 路径下的子目录,例如:"config": { "vendor-dir": "third-party", "bin-dir": "third-party/bin" } - 如果用了
composer create-project,它默认不会继承目标项目的bin-dir配置,首次安装仍可能漏掉,建议安装完手动跑一次composer install - 某些老版本 Composer(< 2.2)对非 vendor 名的 bin-dir 支持不稳定,遇到链接失败先升级 Composer
路径改起来很简单,但 autoload、bin、CI 脚本、团队约定这四块最容易漏掉。尤其是上线前没验证 require 'new-path/autoload.php' 是否真能加载,一部署就报错。










