
Composer 的 vendor 目录默认不可更改,config.vendor-dir 仅在 vendor 不存在时生效;修改后需同步更新 autoload.php 引入路径、bin 调用及 IDE 配置,否则导致类找不到或命令失败。
Composer 的 vendor 目录是硬编码在逻辑里的,composer install 或 composer update 一定会把依赖写入项目根目录下的 vendor 文件夹。你没法通过命令行参数或配置项把它改成 libs、deps 或其他名字——哪怕改了 composer.json 里的 config.vendor-dir,也只影响后续操作,且有严格前提。
这个配置项必须在 composer.json 中提前写好,而且只有在 vendor 不存在时才起作用。一旦你已经运行过 composer install,再改 vendor-dir 并不会移动已有包,也不会让下次 update 写到新路径。
vendor + 删除 composer.lock,再执行 composer install
{
"config": {
"vendor-dir": "third-party"
}
}autoload.files、PSR-4 映射)仍会按新路径解析,但 Compos
PHP 自动加载器(vendor/autoload.php)的路径会随 vendor-dir 变化,意味着你代码里 require 'vendor/autoload.php' 得同步改成 require 'third-party/autoload.php'。同理,bin 目录下的可执行文件(比如 phpunit、laravel-zero)也会生成在新路径下,系统 PATH 或脚本调用要相应调整。
composer dump-autoload 会读取当前 vendor-dir 值重新生成映射composer run-script 中引用的 vendor/bin/xxx 需手动适配为 third-party/bin/xxx
如果你目标是“把依赖和项目源码物理分离”,vendor-dir 不是可靠方案。更稳妥的做法是:
vendor,用 composer install --no-scripts 避免触发可能依赖路径的脚本vendor 指向外部目录:rm -rf vendor ln -s /path/to/shared/vendor ./vendor
composer.lock 与 composer.json 版本匹配真正难的不是改路径,而是让整个生态(自动加载、bin 调用、IDE 支持、部署脚本)都跟上这个改动——稍有遗漏,就会出现 Class not found 或 command not found。