唯一可靠方式是在项目根目录composer.json的config字段设"vendor-dir":"third-party";COMPOSER_VENDOR_DIR在2.x中已移除,-d参数仅改变composer.json查找路径,不影响vendor写入位置。

改 vendor 目录位置,只有一条路真正可靠:在项目根目录 composer.json 的 config 字段里写 "vendor-dir": "third-party"。其他方式要么失效,要么引发后续一连串路径错乱。
为什么 COMPOSER_VENDOR_DIR 和 -d 参数都不行
COMPOSER_VENDOR_DIR 环境变量在 Composer 2.x 中已被移除,设了也静默忽略;composer install -d /path 只是告诉 Composer 去哪找 composer.json,完全不影响 vendor 写入位置——它等价于先 cd /path 再执行 install,包仍会装进原项目的 vendor/ 或已配置的 vendor-dir 下。
- CI 脚本里滥用
-d是常见翻车点:本地跑通,流水线却报Class not found,根源就是没配config.vendor-dir - 想换路径,必须提前在目标项目的
composer.json里写死config.vendor-dir,不能靠运行时参数补救
config.vendor-dir 生效的三个硬性条件
这个配置不是写了就生效,必须同时满足:
- 写在项目根目录
composer.json最外层的config字段下(不能塞进extra、不能缩进错层) - 值必须是相对路径,如
"libs"或"third-party",不能以/开头,也不支持$HOME或通配符 - 运行
composer install前,旧vendor目录必须已删除;composer update不会迁移已有包
漏掉任一条件,vendor 就还是落在默认位置,且不会报错提示。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
改完路径后,哪些地方必须手动同步更新
autoload.php、bin/ 下的可执行文件、自动加载映射全都会生成到新路径,但 Composer 不会帮你改代码或环境里的引用:
- 所有
require 'vendor/autoload.php'都得手动改成新路径,比如require 'third-party/autoload.php' - IDE(如 PHPStorm)默认只索引
vendor,需手动在Settings → PHP → Include Paths中添加新路径 - 如果用了
bin-dir,必须在config中显式配对,例如:"bin-dir": "third-party/bin",否则vendor/bin/phpunit这类软链会断开 - CI/CD 脚本中硬编码的路径(如
vendor/bin/phpunit)必须同步更新为third-party/bin/phpunit
extra.installer-paths 不是“包名路由表”
它只对声明了特定 type(如 wordpress-plugin)且项目已引入对应 installer(如 composer/installers)的包生效;普通 library 类型哪怕写进规则里,也照旧进 vendor。
- 必须删掉整个
vendor和composer.lock,再跑composer install—— 它不会重排已有包 - 目标包的
composer.json必须明确声明匹配的type,且extra.installer-paths中的包名必须完全一致(大小写敏感),不支持通配符 - 路径中的
{$name}是占位符,会被替换成包名最后一段(如acme/my-plugin→my-plugin),路径必须相对于项目根目录,不能以/开头
最常被忽略的是:你以为在 installer-paths 里写了就能把任意包挪走,其实它只是 installer 类型分发器,不是通用路径重定向机制。

















