只能用extra.installer-paths配合type字段和对应installer插件重定向特定类型包;config.vendor-dir仅整体迁移vendor目录,不参与type路由,故对WordPress插件等无效。

只能用 extra.installer-paths 配合包的 type 字段和对应 installer 插件,普通库或未声明 type 的包完全无法重定向。
为什么 config.vendor-dir 对插件没用
它改的是整个 vendor/ 目录位置,属于全局搬迁,不是“按模块类型分流”。WordPress 插件、Drupal 模块这类东西需要进 wp-content/plugins/ 或 web/modules/,跟 vendor 是否叫 libs 无关。硬套 config.vendor-dir 只会让所有包一起挪走,违背模块化部署初衷。
常见错误现象:"config": {"vendor-dir": "third-party"} 写进去了,但 akismet 还是落在 third-party/ 下,没进 wp-content/plugins/akismet/——因为这个配置根本不参与 type 分发逻辑。
extra.installer-paths 必须满足的三个硬性条件
缺一不可,少一个就静默失效:
- 项目已运行
composer require composer/installers(v2.x 起必须) - 目标包自身
composer.json中明确写了"type": "wordpress-plugin"这类被识别的 type(不能是library,也不能不写) - 删掉整个
vendor/目录 +composer.lock,再跑composer install——已有包不会被重排
示例配置(写在项目根目录 composer.json 的 extra 字段下):
"extra": {
"installer-paths": {
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"],
"web/modules/{$name}/": ["type:drupal-module"]
}
}
注意:{$name} 是占位符,会被替换成包名最后一段(如 wpackagist-plugin/akismet → akismet),路径必须是相对路径,不能以 / 开头。
私有包或没设 type 的包怎么处理
你没法改别人包的 type,但可以自己定义一个新 type 并让 composer/installers 认识它:
- 在你要定制的包的
composer.json里加"type": "myapp-extension" - 在项目根目录
composer.json的extra里补上映射:"myapp-extension": ["myorg/*"] - 同时确保
installer-paths包含对应路径规则,比如"extensions/{$name}/": ["type:myapp-extension"]
这样 myorg/my-tool 就会进 extensions/my-tool/,而不是 vendor/myorg/my-tool/。关键点在于:type 是路由开关,没有它,installer-paths 就是废配置。
容易忽略的路径和加载问题
即使路径配置生效,后续仍要手动处理三件事:
- PHP 代码里所有
require 'vendor/autoload.php'必须改成新路径,比如require 'wp-content/plugins/akismet/vendor/autoload.php'(如果该插件自身带 autoload) - IDE(如 PHPStorm)默认只索引
vendor/,需手动添加新路径到Settings → PHP → Include Paths - 某些插件依赖
vendor/bin/下的命令行工具,它们不会自动复制到wp-content/plugins/xxx/bin/,得靠脚本或 post-install-cmd 手动搬运
最常被跳过的动作是删 vendor 和 composer.lock —— 不做这步,所有配置都只是纸上谈兵。











