composer不管理配置文件版本,仅通过插件在安装时一次性复制预置模板到项目目录,需严格匹配type、正确配置插件autoload、清理缓存与lock文件才能生效。

Composer 本身不管理配置文件版本
它只管 PHP 包的下载、解压、autoload 注册和脚本执行,不会自动跟踪、比对或回滚项目里的 config/、phpunit.xml 这类文件。所谓“分发默认配置”,本质是插件在安装/更新时,把包里预置的模板文件复制(或软链)到项目指定位置——这动作是一次性的,不带版本快照、不记录 diff、也不提供 rollback 命令。
用 Installer 插件实现配置分发的关键点
要让一个包(比如 acme/app-config)安装时自动把 config/*.php 复制到项目根目录的 config/ 下,必须写一个实现了 ComposerPluginPluginInterface 的插件,并监听 InstallerEvent:
- 插件类的
supports()必须返回true仅当$package->getType() === 'config'(字符串全等,不能模糊匹配) -
getInstallPath()返回空字符串(表示不进vendor/),否则 Composer 会先把它解压到 vendor 目录再走后续逻辑 - 真正复制动作得在
onPackageInstall()里做:用$event->getPackage()->getInstallationSource()->getAbsolutePath()拿到刚解压的包路径,再用copy()或symlink()把其中res/config/下的文件丢到项目根目录对应位置 - 必须检查目标文件是否已存在,避免覆盖用户已修改的配置;建议加
extra.my-config-plugin.force-publish开关来控制是否强制覆盖
为什么 installer-paths 配置对配置文件无效
installer-paths 是 composer/installers 提供的映射规则,但它只支持它硬编码识别的 type,比如 wordpress-plugin、cakephp-plugin。你写 "config/{$name}/": ["type:config"],只要没装能处理 type:config 的专用 installer,这条规则就完全不触发——Composer 不会报错,也不会警告,只是静默忽略。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
常见错误现象:
- 写了
installer-paths却发现config/目录始终为空 -
composer show能看到插件已加载,但supports('config')返回false(因为插件类根本没被调用) - 插件类存在,但
autoload没配对,导致 Composer 找不到类,加载失败且无提示
发布配置前必须确认的三件事
缺一不可,否则白写插件:
- 被安装的包(如
acme/app-config)的composer.json中必须声明"type": "config",且该字段值要和插件中supports()判断的字符串完全一致 - 插件自身必须作为
require-dev或require出现在**根项目**的composer.json中,不能只放在被分发包里 - 每次改完插件代码后,必须运行
composer clear-cache+ 删除vendor/+ 删除composer.lock+ 重新composer install;update不会重走安装路径逻辑
最易被忽略的是最后一点:缓存和 lock 文件会固化旧的安装路径决策,哪怕插件代码已修复,不清理它们就永远看不到效果。










