修改已安装包的 composer.json 只能通过插件拦截事件或自定义 repository:前者用 plugininterface 监听 pre_package_install/update 动态替换 package 实例,后者注册 array/vcsrepository 提前注入伪造包;禁止直接修改 installed.json 或 lock 文件。

composer.json 里的 package 信息不能直接改
插件本身无法修改已安装包的 composer.json 文件内容——Composer 在 install/update 完成后就把包信息固化进 vendor/composer/installed.json 和锁文件里,运行时读的是这个缓存结构,不是源文件。
想“修改包信息”,实际只有两条路:干预 Composer 的加载逻辑,或伪造包元数据。前者靠插件钩子,后者靠自定义 Repository。
用 PluginInterface + EventDispatcher 拦截 package 加载
Composer 插件可通过监听 PackageEvents::PRE_PACKAGE_INSTALL 或 PRE_PACKAGE_UPDATE,在包写入 vendor 前动态替换 Package 实例。这是最常用、也最安全的修改方式。
- 必须实现
PluginInterface并在activate()中注册事件监听器 - 监听器接收
PrePackageEvent,调用$event->setOperation()可替换整个InstallOperation或UpdateOperation - 关键点:新
Package实例的name、version、autoload等字段可任意设,但dist/sourceURL 必须指向真实可拉取位置,否则 install 失败 - 注意兼容性:
Package类在 Composer 2.2+ 有内部重构,避免直接 newCompletePackage,优先用PackageFactory::create
自定义 Repository 替换原始包来源
如果目标是让某个包(比如 monolog/monolog)在 install 时自动用你改过 composer.json 的 fork 版本,就该走 Repository 路线——它比改 event 更彻底,且不依赖插件激活时机。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在插件中注册一个
ArrayRepository或VcsRepository,把伪造的Package对象塞进去 - 必须调用
RepositoryManager::addRepository(),且顺序要在默认ComposerRepository之前,否则会被覆盖 - 常见坑:伪造包的
name和version必须与依赖声明完全一致,否则 Composer 会忽略它去拉原包 - 性能影响小,但调试困难——出问题时
composer show显示的仍是原始包信息,得看vendor/composer/installed.json里实际写入的内容
别碰 installed.json 和 lock 文件手动改
有人试过在插件里直接写 vendor/composer/installed.json 或改 composer.lock,结果必崩:Composer 启动时校验 hash,内容不一致就报 Package is not installed 或直接抛 InvalidLockFileException。
这类操作绕过了 Composer 的完整性机制,等于在引擎运转时拧螺丝——不是不行,是下次 update 就全废。
真正要持久化修改,只能靠重写 Repository 或提交 PR 到上游;临时调试用 event 拦截足够,别贪快走文件直写。










