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

config.vendor-dir 是唯一真正生效的全局路径配置
想让所有包都装进 third-party 或 libs 而不是默认的 vendor,只能靠项目根目录 composer.json 里的 config.vendor-dir。其他方式——比如环境变量、命令行参数、全局配置——在 Composer 2.x 中要么被移除,要么被静默忽略。
它必须满足三个条件才生效:
- 配置写在项目根目录的
composer.json最外层config字段下,不能错放到extra或缩进错误 - 值必须是相对路径(如
"libs"),不能以/开头,也不支持$HOME或通配符 - 运行
composer install前,旧vendor目录必须已删除;composer update不会迁移已有包
改完后,autoload.php、bin/ 下的可执行文件、自动加载映射全都会生成到新路径,但 PHP 代码里所有 require 'vendor/autoload.php' 都得手动改成新路径,IDE 和 CI 脚本同理。
installer-paths 只对 type 匹配的包生效
extra.installer-paths 看起来像“按包指定路径”,但它根本不是通用路径重定向机制。它只在满足以下全部条件时触发:
- 目标包的
composer.json明确声明了type(如"wordpress-plugin") - 你的项目已通过
composer require composer/installers(或专用 installer 如wpackagist/installer)引入对应 installer -
installer-paths的键是相对于项目根的路径,值中包名必须完全匹配(区分大小写),且不能用通配符写成"myorg/*"——除非你同时在包里自定义了type并在installer-paths中显式映射该type
普通库(type: library)哪怕写进 installer-paths 规则里,也照旧进 vendor。这是最常被误解的一点:它不是“包名路由表”,而是“installer 类型分发器”。
COMPOSER_VENDOR_DIR 在 Composer 2.x 中已失效
这个环境变量在 Composer 2.x 中已被移除,设置后不会产生任何效果。很多人仍习惯性导出它,结果发现路径没变、autoload 报错、CI 流水线失败——问题就出在这里。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
如果你在脚本里写了类似这样的逻辑:
export COMPOSER_VENDOR_DIR="third-party" composer install
那它等价于什么都没写。Composer 完全忽略该变量。真正起作用的是 config.vendor-dir,且必须写在 composer.json 里。
注意:COMPOSER_HOME 是有效的,但它控制的是全局配置与缓存位置(如 ~/.composer/),和 vendor 目录无关。
composer install -d 参数不改变 vendor 写入位置
composer install -d /path 只是告诉 Composer 去哪找 composer.json 和 composer.lock,它完全不影响 vendor 写入位置。你加了 -d,包还是照常装进原项目的 vendor/(或已配置的 vendor-dir)。
常见误用场景:
- 在 CI 脚本里用
composer install -d /tmp/build,以为能隔离依赖路径,结果本地跑通、流水线报Class not found - 试图用
-d配合COMPOSER_VENDOR_DIR实现双保险——两个都无效
真要换路径,必须提前在目标项目的 composer.json 中写死 config.vendor-dir,并确保旧 vendor 已清空。










