Composer 的 vendor 目录默认不可更改,config.vendor-dir 仅在 vendor 不存在时生效;修改后需同步更新 autoload.php 引入路径、bin 调用及 IDE 配置,否则导致类找不到或命令失败。

composer install 默认把包装到 vendor 目录,不能改
Composer 的 vendor 目录是硬编码在逻辑里的,composer install 或 composer update 一定会把依赖写入项目根目录下的 vendor 文件夹。你没法通过命令行参数或配置项把它改成 libs、deps 或其他名字——哪怕改了 composer.json 里的 config.vendor-dir,也只影响后续操作,且有严格前提。
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 映射)仍会按新路径解析,但 Composer 脚本、插件、bin 文件可能出问题
vendor-dir 改动会影响 autoload 和 bin 文件位置
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 - 某些 IDE(如 PhpStorm)可能缓存 vendor 路径,需手动刷新索引
真要隔离依赖?考虑 symlink 或 --no-scripts + 手动迁移
如果你目标是“把依赖和项目源码物理分离”,vendor-dir 不是可靠方案。更稳妥的做法是:
- 保持默认
vendor,用composer install --no-scripts避免触发可能依赖路径的脚本 - 安装完后用符号链接把
vendor指向外部目录:rm -rf vendor ln -s /path/to/shared/vendor ./vendor
- 确保该外部目录已存在、权限正确,且
composer.lock与composer.json版本匹配 - CI/CD 中注意:符号链接在 Windows Git Bash 下可能失效,Docker 容器内需挂载对应路径
真正难的不是改路径,而是让整个生态(自动加载、bin 调用、IDE 支持、部署脚本)都跟上这个改动——稍有遗漏,就会出现 Class not found 或 command not found。










