Composer Installer是让第三方包按框架规范自动安装的插件,需被安装包自身声明正确type(如wordpress-plugin)且项目配置installer-paths才生效,否则仍落入vendor/。

Composer Installer 不是 Composer 的安装程序,它是让第三方包能按框架规范自动落地的插件——装错地方或配错 type,composer install 会把包扔进 vendor/ 而不是 wp-content/plugins/ 或 app/Providers/。
composer require composer/installers 之后没生效?检查 type 字段是否写对
插件生效的前提是被安装的包自己声明了正确的 type,而不是你项目里装了 composer/installers 就自动接管所有依赖。
-
composer/installers只负责“识别 + 搬运”,它不改写任何包的逻辑 - 你要安装的包(比如一个 WordPress 插件)必须在它的
composer.json里明确写:"type": "wordpress-plugin" - 如果该包写的是
"type": "library"或压根没写type,哪怕你本地装了composer/installers,它也会走默认路径vendor/xxx/yyy - 验证方式:装完后看
vendor/下有没有那个包;如果没有,说明它被挪走了——再查目标目录(如wp-content/plugins/)是否出现
自定义 installer-paths 时路径变量写法容易出错
installer-paths 支持变量插值,但只认 {$name} 和 {$vendor},不支持 {$version} 或任意字符串拼接。
- 正确写法:
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"] - 错误写法:
"wp-content/plugins/{$name}-v{$version}/": [...]——{$version}不被解析,最终生成空目录或报错 - 路径结尾的斜杠
/必须有,否则 Windows 下可能因路径分隔符问题导致创建失败 - 多个规则用数组写,顺序无关,但匹配优先级由
composer/installers内部实现决定,不建议靠顺序控制逻辑
升级到 Composer 2.5+ 后 installer-paths 配置失效?检查 key 名拼写
Composer 2.4 起将配置项从 installer-paths 改为 installer-paths(没错,拼写没变),但很多人误写成 installers-paths 或 install-path,这类拼写错误不会报错,只是静默忽略。
- 必须严格使用:
"installer-paths"(注意是installer,不是installers) - 完整结构示例:
{ "extra": { "installer-paths": { "wp-content/plugins/{$name}/": ["type:wordpress-plugin"], "app/Modules/{$name}/": ["type:laravel-module"] } } } - 验证是否加载成功:运行
composer config extra.installer-paths,输出应为对应 JSON 对象;若为空,说明 key 写错了或没在顶层extra下
为什么 vendor/ 里还有包残留?composer dump-autoload 不管用
composer/installers 是安装时行为,不是 autoload 行为。它只影响 composer install 或 composer update 时的文件落点,跟类自动加载完全无关。
- 残留包通常是因为之前没配
installer-paths,包已下在vendor/;新配完后,旧包不会自动搬走 - 必须手动删掉
vendor/xxx/yyy目录,再执行composer install或composer update xxx/yyy -
composer dump-autoload只刷新vendor/autoload.php映射,不影响文件物理位置 - 如果某个包既出现在
installer-paths规则里,又出现在require列表中,它仍会被复制过去——installer-paths不阻止vendor/下存在副本,只是多建一份软链接或硬拷贝(取决于实现)
最常被忽略的一点:composer/installers 的行为高度依赖被安装包自身的 type 声明,而不是你本地怎么想。别指望靠改自己项目的配置去“强制”某个未声明 type 的通用库进特定目录——它根本不会触发搬运逻辑。


















