在 composer.json 的 extra.installer-paths 中配置路径映射,仅对使用 composer/installers 且声明了支持 type(如 wordpress-plugin)的包生效;普通库不受影响,且需确保已 require composer/installers。

composer.json 里怎么写 install-path
直接在 composer.json 的 extra 段里配 installer-paths,不是靠全局配置或命令行参数。这个字段只对使用了自定义安装器的包生效(比如 composer/installers 支持的 WordPress、Drupal 等),普通 PHP 库不走这条路。
常见错误是以为加了就所有包都移动位置——其实它只影响那些声明了 type 且被 composer/installers 识别的包,比如 type: wordpress-plugin。
- 确保项目已 require
composer/installers(否则installer-paths完全无效) -
installer-paths是个对象,key 是目标路径(相对 vendor 目录),value 是 type 或 package name 的数组 - 路径里不要以
/开头,wp-content/plugins✅,/wp-content/plugins❌ - 多个规则按顺序匹配,但只应用第一个命中项(不叠加)
示例:
"extra": {
"installer-paths": {
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"],
"wp-content/themes/{$name}/": ["type:wordpress-theme"],
"custom-libs/{$name}/": ["myvendor/my-package"]
}
}
为什么 install-path 对 vendor 下的普通库没用
因为 Composer 默认只把包解压到 vendor/{vendor}/{package},而 installer-paths 是 composer/installers 提供的扩展逻辑,它只拦截并重定向那些明确标记了特定 type 的包。
如果你只是想把某个通用 PHP 库(比如 monolog/monolog)挪到别处,installer-paths 不起作用——它没有对应 type,也不会被 installers 拦截。
- 普通库改路径只能靠符号链接或构建脚本后处理
- 强行给普通包设
type并指望 installers 处理,会导致 autoload 失败(PSR-4 路径和实际文件位置不一致) - 某些包内部硬编码了相对于
vendor的路径(如配置文件查找逻辑),移走后运行时报错
install-path 配置后 composer install 没反应?检查这三件事
最常踩的坑不是写法错,而是环境没到位。
- 确认
composer/installers在require-dev或require里存在,且版本 >= 1.0(旧版可能不支持某些 type) - 运行
composer show composer/installers看是否真被加载;如果没出现,说明没装或装在了错误作用域 - 删掉
vendor和composer.lock,再跑composer install—— install-path 不会重排已安装的包,只影响新安装或更新
错误现象举例:wordpress-plugin 还在 vendor/xxx/yyy,但 wp-content/plugins/ 下空空如也 → 八成是 composer/installers 没生效。
install-path 和 post-autoload-dump 脚本混用的风险
有人为了“保险”加了脚本自动挪文件,结果和 install-path 冲突:installers 把包解压到 wp-content/plugins/xxx,脚本又把它复制/移动到别处,导致后续 composer update 时 installers 找不到原目录,报 Could not delete ... 错误。
- 二者目标都是控制文件位置,但机制不同:install-path 是解压时定向,脚本是解压后搬运
- 混用时,脚本必须判断路径是否已被 installers 处理过,否则反复操作会破坏状态
- 更稳的做法是只选一种:优先用 install-path(轻量、可复现),除非有 installers 不支持的特殊路径逻辑
真正难搞的不是怎么写 install-path,而是得清楚哪些包能被它管、哪些不能,以及它和 autoloading、插件激活机制之间的耦合点——这些地方一松动,整个部署流程就容易静默失败。










