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

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_VENDOR_DIR=third-party composer install,这在 Composer 2.x 中不会改变包安装位置。该环境变量早在 v2 发布时就被移除,现在只影响极少数调试行为,对 vendor-dir 写入路径完全无感。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
如果你看到它“偶尔生效”,大概率是因为:
- 你实际运行的是 Composer 1.x(已停止维护)
- 误将
--working-dir和COMPOSER_VENDOR_DIR混用,而真正起作用的是工作目录切换本身,不是环境变量 - CI 环境里残留了旧版缓存或 wrapper 脚本做了额外处理
别依赖它。要稳定控制路径,回到 config.vendor-dir + 清目录 + install 这个组合。
path 类型仓库无法用配置改安装位置
当你用 "type": "path" 引入本地模块(比如 "../my-module"),Composer 默认创建符号链接到 vendor/vendor-name/package-name。这个行为由 type 机制硬编码决定,config.vendor-dir 和 installer-paths 都不干预。
如果你需要模块代码出现在 src/modules/my-module 这类非 vendor 路径:
- 删掉
repositories里的path条目 - 用系统级符号链接(
ln -sf)或构建脚本同步目录 - 在
autoload中显式添加该路径(如"psr-4": {"MyModule\": "src/modules/my-module/src/"})
否则 IDE 无法跳转、静态分析工具报未加载类,都是因为自动加载没覆盖那个物理路径。










