唯一真正生效的方式是在项目根目录composer.json的config字段中配置"vendor-dir",如"third-party";必须删除旧vendor后执行install,且require路径、bin-dir、IDE及CI脚本均需同步更新。

config.vendor-dir 是唯一真正生效的路径配置方式
想让所有包装进 third-party 或 libs 而不是默认 vendor,只能靠项目根目录 composer.json 里的 "config": {"vendor-dir": "third-party"}。其他方法——比如 COMPOSER_VENDOR_DIR 环境变量、-d 参数、全局 config.json ——在 Composer 2.x 中已被移除或静默忽略。
这个配置必须满足三个硬性条件才起作用:
- 写在项目根目录
composer.json的最外层config字段下,不能错放到extra或缩进错误 - 值必须是相对路径(如
"libs"),不能以/开头,也不支持$HOME或通配符 - 运行
composer install前,旧vendor目录必须已删除;composer update不会迁移已有包
-d 参数根本不会改 vendor 写入位置
composer install -d /tmp/myapp 看起来像把包装到 /tmp/myapp/vendor,其实它等价于 cd /tmp/myapp && composer install——vendor 还是照常写进 /tmp/myapp/vendor(或该目录下已配置的 vendor-dir)。很多人在 CI 脚本里滥用这个参数,结果本地跑通、流水线报 Class not found,根本原因是只换了工作目录,没同步配对 vendor-dir。
如果你真需要在临时目录安装依赖,正确做法是:
- 先确保目标目录(如
/tmp/myapp)下已有带config.vendor-dir的composer.json - 删掉该目录下的旧
vendor - 再执行
composer install(不用加-d)
installer-paths 只对特定 type 的包生效
extra.installer-paths 不是“按包名路由”,而是“按 installer 类型分发”。它只在以下三个条件同时满足时触发:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目已通过
composer require composer/installers引入对应 installer(且版本 ≥ 2.0) - 目标包自身
composer.json明确声明了匹配的type(如"type": "wordpress-plugin"),普通library类型完全不触发 - 必须删掉整个
vendor和composer.lock,再跑composer install——它不会重排已有包
示例配置(写在根项目 composer.json 的 extra 字段下):
"extra": {
"installer-paths": {
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"],
"web/core/": ["drupal/core"]
}
}
注意:{$name} 是占位符,会被替换成包名最后一段(如 acme/my-plugin → my-plugin);路径必须相对于项目根目录,不能以 / 开头。
改完 vendor-dir 后 autoload 和 bin 都要手动同步
vendor/autoload.php 是生成时写死路径的入口文件。你改了 vendor-dir,但没重建整个 vendor 结构,旧文件还在原地,PHP 还在找原来的 vendor/autoload.php。
所以必须:
- 删掉现有
vendor目录 - 执行
composer install或composer update(dump-autoload不够,它只刷新类映射,不重建入口文件) - 代码里所有
require 'vendor/autoload.php'都得改成新路径,比如require 'third-party/autoload.php' - 如果用了
bin文件(如phpunit),必须在config中同时指定bin-dir,且值要匹配新vendor下的子目录,例如:"config": { "vendor-dir": "third-party", "bin-dir": "third-party/bin" } - IDE(如 PHPStorm)需手动在
Settings → PHP → Include Paths中添加新路径;CI 脚本中所有硬编码的vendor/bin/phpunit也得更新
最容易被忽略的是:改了 vendor-dir 后,autoload.files、PSR-4 映射这些自动加载逻辑本身不受影响,但所有外部引用点(代码、脚本、IDE、CI)都得人工对齐——漏一处,就报错。

















