config.vendor-dir是唯一真正生效的全局路径配置,必须写在项目根目录composer.json的config字段下、用相对路径、且运行install前需删除旧vendor目录;composer_vendor_dir在composer 2.x中已失效,installer-paths仅对声明type并启用对应installer的包生效。

config.vendor-dir 是唯一真正生效的配置项
想把 vendor 目录挪到 third-party 或 libs,别试环境变量、命令行参数或全局设置——Composer 2.x 中只有项目根目录 composer.json 里的 config.vendor-dir 能生效。其他方式要么被忽略,要么只在极旧版本中偶然起作用。
它必须满足三个硬性条件:
- 写在
composer.json最外层的config字段下,不能嵌进extra或缩进错位 - 值是相对路径(如
"third-party"),不能以/开头,也不支持$HOME或通配符 - 执行
composer install前,旧vendor目录必须已删除;composer update不会迁移已有包
改了 vendor-dir 后 autoload.php 找不到?不是配置问题,是路径没同步
vendor/autoload.php 是生成时写死路径的入口文件。你改了 config.vendor-dir,但没重建整个 vendor 结构,PHP 还在找原来的路径。
必须做这三件事:
- 删掉现有
vendor目录(连同composer.lock可选,但建议一起删) - 运行
composer install(不是dump-autoload) - 所有 PHP 入口文件里
require 'vendor/autoload.php'都得手动改成新路径,比如require 'third-party/autoload.php'
IDE(如 PhpStorm)默认只索引 vendor,需手动在 Settings → PHP → Include Paths 中添加新路径。
bin 文件失效、命令调不了?漏配 bin-dir 是主因
部分包(如 phpunit、laravel-zero)在 composer.json 中声明了 "bin" 字段,Composer 会把对应二进制文件软链到 vendor/bin/。你只改了 vendor-dir,没同步改 bin-dir,链接就断了。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
必须在 config 中同时指定:
"config": {
"vendor-dir": "third-party",
"bin-dir": "third-party/bin"
}
注意:bin-dir 的值必须是相对于项目根的路径,且要匹配新 vendor 下的实际子目录结构。CI 脚本或部署命令中硬编码的 vendor/bin/phpunit 也得同步更新为 third-party/bin/phpunit。
installer-paths 不是“按包名重定向”,它是 type 分发器
很多人误以为在 extra.installer-paths 里写 "libs/{$name}/": ["myorg/*"] 就能把所有包都塞进 libs,其实完全不生效。
它只在以下三个条件全部满足时才触发:
- 目标包自己的
composer.json明确声明了"type"(如"wordpress-plugin") - 你的项目已通过
composer require composer/installers引入对应 installer(且版本 ≥ 2.0) -
extra.installer-paths的键是相对于项目根的路径,值中的包名必须完全匹配(区分大小写),不能用通配符
普通库("type": "library")哪怕写进规则里,也照旧进 vendor。这不是 bug,是设计如此——它本质是 installer 类型分发器,不是路径路由表。
最常被忽略的一点:改完 config.vendor-dir 后,autoload.php、bin、autoload_psr4.php 全部是重新生成的,但代码里、IDE 里、CI 里所有硬编码路径都得你亲手改一遍,没有自动同步机制。










