虚拟包(如ext-curl、php>=8.1)无法自定义安装路径,因其不被实际安装,仅作依赖约束占位符;installer-paths和config.vendor-dir对其完全无效;真正可定制路径的是声明了type并被对应installer识别的真实包。

虚拟包(virtual package)根本不能自定义安装路径
Composer 不支持为虚拟包(如 ext-curl、php >= 8.1、lib-icu)指定安装路径——它们压根不被“安装”。虚拟包只是声明依赖约束的占位符,没有源码、没有 composer.json、不生成文件、不进 vendor,自然也不存在“路径可配置”这回事。
常见误解场景:
- 你在
require里写了"ext-gd": "*",以为它会像普通包一样被下载到某处 → 实际只是运行时检查扩展是否已启用 - 你看到
composer show列出了ext-mbstring,误以为它被“装”了 → 它只是 Composer 解析依赖图时的逻辑节点 - 你试图在
installer-paths或config.vendor-dir里匹配虚拟包名 → 配置完全被忽略,无任何效果
哪些包看似“虚拟”实则可定制路径?
真正能改路径的,是那些声明了 type 字段 + 被 installer 识别 的真实包,比如:
-
wpackagist-plugin/akismet(type:wordpress-plugin)→ 可配到wp-content/plugins/akismet/ -
drupal/core(type:drupal-core)→ 可配到web/core/ - 你自己写的
myorg/config-bundle,设"type": "myapp-config"并配好composer/installers→ 可落到config/
关键判断依据:composer show vendor/name 输出中必须有 type 行,且该 type 已被项目中已安装的 installer(如 composer/installers 或 wpackagist/installer)所支持。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
为什么 installer-paths 对虚拟包无效
因为 installer-paths 是 installer 插件的路由规则,只在 Composer 执行“安装真实包”阶段介入。虚拟包跳过整个安装流程,连 InstallationManager::install() 都不会调用,更不会触发路径映射逻辑。
验证方法:删掉 vendor 和 composer.lock,执行 composer install -vvv,你会看到虚拟包只出现在 “Resolving dependencies” 阶段,后续无 “Installing…” 日志。
真想让“类虚拟”内容进自定义目录?得换思路
如果你实际想要的是:把某些配置、脚本、模板等资源文件“按需注入”到项目特定位置(比如 resources/templates/),那不是虚拟包问题,而是:
- 用真实包 + 自定义
type+composer/installers扩展支持 - 写一个轻量插件,监听
post-install-cmd或post-update-cmd,手动复制文件 - 直接用
scripts字段跑 shell 命令,比如"post-install-cmd": "cp -r vendor/myorg/templates resources/"
记住:路径定制能力永远绑定在“真实包的安装行为”上,不是靠名字像不像虚拟包来决定的。

















