Composer install 不会自动打补丁,必须安装 cweagans/composer-patches 插件并在 composer.json 的 extra.patches 中声明补丁,否则不触发;插件通过 composer require 安装后自动注册,补丁路径须匹配包结构,失败时需检查版本一致性、hunk 偏移及 Git 状态。

composer install 不会自动打补丁——它只还原依赖,不处理 patch。必须用 cweagans/composer-patches 插件,且补丁声明必须写进 composer.json 的 extra.patches 字段,否则根本不会触发。
怎么装 composer-patches 插件
在项目根目录运行这条命令即可:
composer require cweagans/composer-patches
插件会自动注册,无需额外激活。安装后:composer.json 里会出现 "cweagans/composer-patches" 条目,composer.lock 也会记录插件版本。
注意:不要手动改 vendor/ 目录名或移动它——cweagans/composer-patches 依赖 vendor 下的原始包结构来定位文件,路径错位会导致 patch 应用失败,报 fatal: not a git repository 或 cannot find file to patch。
怎么在 composer.json 里写补丁配置
补丁必须放在 extra.patches 下,格式是:
"extra": {
"patches": {
"monolog/monolog": {
"fix null coalesce in Logger::log": "patches/monolog-null-coalesce.patch"
}
}
}
关键点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
"monolog/monolog"必须和composer show输出的包名完全一致(包括大小写、斜杠) - 补丁路径支持相对路径(如
patches/xxx.patch),也支持远程 URL(如https://example.com/patch.diff) - 同一个包要打多个 patch,必须写成数组,顺序不能错:
"patches": ["desc1": "a.patch", "desc2": "b.patch"]—— 后一个 patch 依赖前一个已生效的代码状态 - 别把补丁写进
require或require-dev,那只会当普通包装,完全无效
补丁应用失败常见原因和应对
最常卡在 error: patch failed: src/Logger.php:123 这类 hunk 偏移错误,本质是 patch 文件基于的源码版本和当前安装的包版本不匹配。
先别急着重做 patch,试试这几个办法:
- 加
--no-cache -v重新跑:composer install --no-cache -v,看具体哪一行 offset 失败,快速定位改动点 - 在对应 patch 配置里加
"revert": true键(值为布尔 true),让插件先反向打一次再正向打,有时能绕过 strict offset 检查 - 确认你锁的版本(
composer.lock中monolog/monolog的 version)是否和 patch 生成时的 commit 一致;不一致就进vendor/monolog/monolog,用git diff重做 patch
补丁内容里如果出现 diff --git a/src/... b/src/...,而目标包没用 Git 管理(比如通过 zip 下载),git apply 会直接失败——这时得确保 vendor 包是 Git 克隆下来的,或改用 patch -p1 兼容格式。
怎么验证补丁真生效了
别只信控制台输出的 “Applying patches”,得实锤:
- 进
vendor/xxx/package,用git status看有没有未提交修改(有说明 patch 已应用) - 检查目标文件是否真被改了,比如打开
vendor/monolog/monolog/src/Logger.php,搜 patch 里写的新增行 - 清掉 OPcache(
opcache_reset()或重启 PHP-FPM),否则即使文件改了,PHP 还在跑旧字节码 - 框架缓存(如 Laravel 的
php artisan config:clear)也要清,避免补丁改的是配置逻辑但缓存没刷新
最容易被忽略的是:有些项目自己写了自定义 post-install-cmd 脚本,里面调用了 git apply 或类似逻辑,会覆盖或干扰 cweagans/composer-patches 的行为——得检查 composer.json 的 scripts 字段。

















