不能。config.vendor-dir仅支持整体迁移vendor目录,无法为单个包(如monolog/monolog)指定独立安装路径;installer-paths仅对声明了特定type(如wordpress-plugin)且已安装composer/installers的包生效,普通library类型包不支持该机制。

config.vendor-dir 只能改整个 vendor 目录,不能指定单个包
想让 monolog/monolog 装到 libs/monolog、其他包还留在 vendor/?config.vendor-dir 不支持这种粒度。它只能把整个 vendor/ 搬走,比如改成 third-party/,所有包都会进去。一旦你写了:
"config": { "vendor-dir": "third-party" }——那 composer install 就再也不会碰 vendor/,连 vendor/autoload.php 都不会生成。
installer-paths 仅对特定 type 的包生效,普通 library 不行
真正能“指定单个包路径”的机制是 extra.installer-paths,但它有硬性前提:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 目标包的
composer.json必须声明"type": "wordpress-plugin"这类 Composer 官方认可的类型(不是你自己随便写的) - 你的项目必须已安装
composer/installers(v2+ 推荐) - 配置必须写在根项目
composer.json的extra字段里,且格式严格
wordpress-plugin、drupal-module、laravel-library、symfony-bundle(v2+)。而 phpunit/phpunit、guzzlehttp/guzzle 这类 "type": "library" 的包,无论你怎么配 installer-paths,都完全不触发。
path 仓库可实现本地包软链接,但不是“安装到指定路径”
如果你手头有个本地开发中的包,想让它出现在项目里并实时调试,repositories.type: "path" 是正解。但它不改变安装路径,而是建符号链接:
- 在根
composer.json的repositories数组里加一项:[{ "type": "path", "url": "./packages/my-utils" }] -
./packages/my-utils/下必须有合法composer.json,其中name和version要和你在require中写的完全一致 - 运行
composer update vendor/name(不是install),才会重建链接
installer-paths 完全无关,也不影响远程包的存放位置。
硬编码路径或脚本搬运属于反模式,CI 中极易断裂
有人用 rsync 把 vendor/monolog/monolog 搬到 custom/monolog,再手动改 autoload 映射——这类做法在本地可能跑通,但在 CI 流水线里大概率失败。原因很实在:
-
composer dump-autoload不会识别你搬过去的目录,除非你额外加 PSR-4 映射 - 下次
composer update会覆盖或删除你手动挪动的文件 - IDE(如 PHPStorm)无法自动索引非标准路径,需手动添加 Include Path
- 部署脚本若依赖
vendor/bin/phpunit,而你把它删了又没同步更新调用路径,就直接报错
vendor-dir(清空重装),或按规范用 installer-paths 处理支持 type 的包。其余都是临时补丁,越用越脆。










