composer通过installer-paths配合type字段及对应installer(如wpackagist/installer或composer/installers)可将包安装至非vendor目录;需确保installer已安装、type匹配且路径变量{$name}/{$vendor}正确使用。

composer.json 里用 installer-paths 控制包安装目录
Composer 默认把所有包装进 vendor/,但像 WordPress 插件、Laravel Nova 扩展这类包,你确实需要它出现在 wp-content/plugins/ 或 resources/nova/ 这种非标准路径。靠改 vendor-dir 不行——那是全局的,得用 installer-paths。
它本质是 Composer 的自定义 installer 机制的一部分,不是 hack,是官方支持的配置项。关键点在于:必须配合包的 type 字段使用,且该 type 得被某个 installer 识别(比如 wordpress-plugin 对应 wpackagist/installer)。
实操建议:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先确认你要定制的包在 packagist 上声明的
type,比如wpackagist-plugin/akismet的 type 是wordpress-plugin - 在你的项目根目录
composer.json的extra段里加installer-paths映射 - 确保已安装对应类型的 installer,例如
composer require wpackagist/installer
{
"extra": {
"installer-paths": {
"wp-content/plugins/{$name}/": ["type:wordpress-plugin"],
"app/Extensions/{$name}/": ["myvendor/custom-extension"]
}
}
}
不依赖 type 的硬编码路径:用 composer/installers + 自定义 type
很多私有包或内部工具没按规范设 type,或者你想绕过 type 限制直接按 vendor/name 定路径。这时候不能只靠 installer-paths,得让 Composer “认识”你的包类型。
composer/installers 是个通用 installer,它默认支持 cakephp-plugin、drupal-module 等几十种 type,但它也允许你扩展——只要你在自己的包里声明一个它不认识的 type,再在根项目里告诉 composer/installers 这个 type 对应什么路径模板,就生效了。
常见错误现象:加了 installer-paths 但包还是进 vendor/——大概率是没装 composer/installers,或者包的 type 根本没被任何 installer 声明支持。
实操建议:
- 在根项目运行
composer require composer/installers - 在你要定制的包的
composer.json中设"type": "myapp-extension" - 在根项目的
composer.json的extra里补上映射:"myapp-extension": ["myvendor/*"],并确保installer-paths包含"extensions/{$name}/": ["type:myapp-extension"]
路径变量 {$name} 和 {$vendor} 能怎么用
Installer 路径里的占位符不是随便写的,composer/installers 只认几个固定变量:{$name}、{$vendor}、{$type}。别想用 {$version} 或正则替换——它不支持。
这些变量值来自包自身的 composer.json,不是你本地的文件名。比如包是 acme/foo-bar,那 {$name} 就是 foo-bar,{$vendor} 是 acme。大小写、连字符都原样保留。
容易踩的坑:
- 路径末尾加不加
/会影响目录结构:"ext/{$name}"和"ext/{$name}/"在某些 installer 实现下行为不同(后者更安全,明确表示是目录) - Windows 下路径分隔符不用管,Composer 内部会自动转
\,你写/就行 - 变量不能嵌套,也不能拼接字符串,比如
"{$vendor}-{$name}"是非法的,会被当字面量处理
为什么 post-autoload-dump 脚本有时不生效
有人想用脚本把包从 vendor/ 复制到目标目录,然后 hook 到 post-autoload-dump。这方法看似灵活,实际问题一堆:复制时机不对(autoload dump 发生在 install/update 中期)、并发执行时可能冲突、无法回滚、且 Composer 2.2+ 对脚本执行顺序做了更严格约束。
真正可靠的路径控制,只有两条路:一是用 installer-paths 配合合法 type;二是用 composer/installers 扩展 type 支持。其他都是临时补丁。
最常被忽略的一点:自定义 installer 必须在 require 或 require-dev 里显式声明,不能只写在 autoload 或 scripts 里——否则 Composer 根本不会加载它。










