只有声明了composer/installers支持type(如wordpress-plugin、drupal-module等)的包才能被installer-paths重定向,普通library类型包不生效。

不能用 installer-paths 控制普通 PHP 库(如 monolog/monolog)的安装位置,它只对声明了特定 type 的包生效,且必须配合 composer/installers 插件使用。
哪些包能被 installer-paths 重定向?
只有在 packagist 上明确声明 "type" 字段、且该类型被 composer/installers 支持的包才适用。常见支持类型包括:
-
wordpress-plugin(对应路径如wp-content/plugins/{$name}/) -
drupal-module、drupal-theme -
cakephp-plugin、laravel-library -
symfony-bundle(需插件 v2+)
你无法修改第三方包的 type 值——这是它 composer.json 里写死的。如果一个包是 "type": "library" 或没声明 type,installer-paths 完全不会匹配它。
installer-paths 配置必须写在根项目 composer.json 的 extra 段里
配置结构必须严格满足格式,否则会被忽略:
-
extra.installer-paths是对象,键是目标路径(支持{$name}占位符),值是包匹配规则数组 - 匹配规则支持
type:xxx、vendor/name、vendor/*三种写法 - 必须已通过
composer require composer/installers安装插件(v2.x 推荐)
示例:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
{
"extra": {
"installer-paths": {
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"],
"app/Modules/{$name}/": ["myorg/*"],
"custom-addons/akismet/": ["wpackagist-plugin/akismet"]
}
}
}
注意:["wpackagist-plugin/akismet"] 这种精确匹配仅在该包确实存在且未被其他规则覆盖时才生效;通配符 myorg/* 优先级低于精确包名,但高于 type: 规则。
为什么改了 installer-paths 却没生效?
最常见原因不是配置写错,而是环境缺失或逻辑误判:
- 没运行
composer require composer/installers—— 插件未安装,整个extra.installer-paths段会被 Composer 忽略 - 包本身
type不匹配:比如你想把guzzlehttp/guzzle装进lib/,但它type是library,而composer/installers默认不处理该类型 - 路径值含非法字符或以
/开头(如"/var/www/plugins"),Composer 会静默跳过该条规则 - 执行了
composer update xxx单包更新,但installer-paths只在完整 install/update 流程中触发重安装逻辑
验证是否生效:删掉 vendor 和 composer.lock,运行 composer install -vvv,观察输出中是否有类似 Installing wpackagist-plugin/akismet (dev-trunk): Downloading... Installing into wp-content/plugins/akismet 的日志。
不要试图用 installer-paths 替代 vendor-dir
installer-paths 和 config.vendor-dir 解决的是完全不同的问题:
-
vendor-dir控制所有依赖的根目录(vendor/→third-party/) -
installer-paths只控制“特定 type 包”在vendor-dir内部的**二级存放位置**(比如把 WordPress 插件从vendor/wpackagist-plugin/akismet移到wp-content/plugins/akismet)
如果你只是想换掉整个 vendor 目录名,直接配 config.vendor-dir;如果目标是 CMS 生态内的插件/模块物理隔离部署,才轮到 installer-paths。混用两者时,installer-paths 的路径是相对于 vendor-dir 的,不是项目根目录。

















