composer installer 是 composer/installers 包提供的扩展机制,仅接管声明了受支持 type(如 wordpress-plugin)的包安装路径,不修改 vendor/ 下默认 library 类型包的位置。

Composer Installer 是什么,它能改哪些路径
Composer Installer 不是独立工具,而是 composer/installers 这个包提供的扩展机制,用于接管非标准类型(如 wordpress-plugin、cakephp-plugin)的安装位置。它本身不修改 vendor/ 下默认包的路径,只影响声明了 type 且该 type 被 installers 支持的包。
常见被接管的路径包括:
-
wordpress-plugin→wp-content/plugins/ -
drupal-module→modules/contrib/ -
typo3-cms-extension→typo3conf/ext/
你无法用它把 monolog/monolog(type: library)装到 lib/ 下——那得靠 composer.json 的 config.vendor-dir,但那是全局 vendor 目录,和 installer 无关。
如何启用并配置 composer/installers
先在项目根目录运行:
composer require composer/installers然后在
composer.json 中为你的自定义包指定正确 type,并确保其 composer.json 里已声明该 type(比如你写了个 WordPress 插件,它的 composer.json 必须含 "type": "wordpress-plugin")。
不需要额外配置就能生效,但如果你想微调路径(比如把所有插件装进 plugins/custom/),可以加 extra.installer-paths:
{
"extra": {
"installer-paths": {
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"],
"app/extensions/{$name}/": ["my-vendor/my-extension"]
}
}
}
注意:{$name} 是占位符,会被包名(如 acme/cool-plugin)替换为 cool-plugin;路径必须以 / 结尾;数组值支持 type: 或具体 vendor/name 匹配。
为什么 vendor 包没按预期路径安装?常见排查点
最常踩的坑是:以为只要加了 composer/installers 就能随便改任何包路径,结果发现 symfony/console 还是在 vendor/symfony/console ——这是对的,因为它 type 是 library,不在 installers 支持列表里。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
检查以下几项:
- 目标包的
composer.json是否真有"type": "xxx",且xxx在composer/installers文档 列表中 -
composer.json的extra.installer-paths键名是否用了双引号包裹(JSON 语法要求) - 执行
composer install前是否删掉了vendor/和composer.lock?缓存可能导致旧路径残留 - 如果用
composer update,确认目标包版本确实更新了(否则 installer 规则不会重应用)
调试时可加 -v 参数看详细日志:
composer install -v会输出每一步安装到哪个路径。
替代方案:想改 vendor 本身位置或 library 类型路径怎么办
如果目标就是把所有 vendor/ 移到别处(比如 lib/vendor),直接改 config.vendor-dir:
{
"config": {
"vendor-dir": "lib/vendor"
}
}
但注意:这会影响所有包,包括 composer/installers 自身;且一旦改了,后续所有 composer 命令都必须在这个项目目录下运行,否则找不到 autoloader。
如果只想移动某个 library 包(比如强制把 guzzlehttp/guzzle 放进 third-party/guzzle),composer/installers 无能为力。可行做法只有两个:
- 用符号链接(
ln -s)手动挂载,但 CI/CD 环境容易出问题 - 改用
composer create-project+ 自定义脚本做 post-install,复杂度陡增,一般不推荐
真正需要精细控制路径时,往往说明项目结构已偏离 Composer 原生约定,这时候该考虑的是重构依赖模型,而不是硬塞路径规则。










