Composer update 本身不触发代码审查,因其仅解析依赖并更新锁文件,不检测BC Break、漏洞或行为差异;需通过CI集成outdated检查、PR自动摘要、CODEOWNERS拦截等机制强制人工审查。

Composer 依赖更新本身不触发代码审查,必须靠外部工具链介入;直接在 composer update 后加人工检查或跳过 CI 是常见但高危做法。
为什么 composer update 不能自动带出审查点
Composer 只负责解析 composer.json、下载包、写入 composer.lock,它不关心版本变更是否引入了 BC Break、安全漏洞或行为差异。CI 中跑 composer install 时用的锁文件是“确定性”的,而 update 是“探索性”的 —— 这个动作天然需要人判断。
-
composer update修改composer.lock,但 Git 默认不会标记该文件的语义变化(比如是小修还是大版本跃迁) - PHPStan/psalm 不会因依赖升级自动重检类型兼容性,除非你显式触发全量分析
- GitHub/GitLab 的 PR diff 里,
composer.lock是二进制格式(v2)或超长 JSON(v1),人类几乎无法肉眼识别关键变更
如何让每次 composer update 强制触发可读审查
核心思路:把“依赖变更”转化为“可 diff、可归因、可拦截”的结构化输出。推荐用 composer outdated --direct --format=json + 自定义脚本生成变更摘要。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 在 CI 的 PR 流程中,增加一步:运行
composer outdated --direct --format=json > outdated.json,再用轻量脚本提取name、version、latest、type字段,生成 Markdown 表格 - 把该表格作为 PR comment 自动追加(GitHub Actions 可用
actions/github-script;GitLab CI 需调 API) - 配置 CODEOWNERS 规则,当
composer.json或composer.lock变更时,自动 @security-team 或 @infrastructure - 禁止直接 push 到 main:所有
composer update必须走 PR,且 CI 检查composer.lock是否由当前composer.json生成(用composer validate --strict+composer install --dry-run)
composer update 常见误操作与防护建议
很多团队把 composer update 当成“升级包”,却忽略了它默认更新全部依赖(包括 require-dev),甚至可能降级某些包(如果约束宽松)。
- 永远避免裸跑
composer update:至少指定包名,如composer update monolog/monolog;若需批量,用--with-dependencies显式声明意图 -
composer update --lock仅更新 lock 文件不改依赖,但容易掩盖真实冲突 —— 它不该出现在 PR 中,只适合本地调试 - PHP 版本不匹配时,
composer update可能静默跳过某些包(如包声明"php": "^8.2",而当前是 8.1),需在 CI 中先校验php -v并与config.platform.php对齐 - 安全风险:不要信任
composer audit的默认输出 —— 它只查 CVE,不查逻辑漏洞。建议搭配symfony/security-checker(已弃用)或直接用php-security-advisories的 GitHub Action
CI 中验证依赖变更是否合规的关键检查项
真正起作用的不是“有没有跑 update”,而是“update 后有没有被质疑”。以下检查必须嵌入 CI 脚本,失败即阻断合并:
- 执行
composer show --outdated --direct,若输出非空,要求 PR 标题含[deps]前缀,并在描述中说明变更原因 - 对比本次
composer.lock与 base 分支的 hash,若变化但未修改composer.json,报错并提示“锁文件漂移,需确认来源” - 运行
composer why-not vendor/package:version对每个升级到新主版本的包做反向验证(例如升laravel/framework到 v11,检查是否有插件尚未适配) - 对
require-dev中的测试类库(如phpunit/phpunit),额外执行vendor/bin/phpunit --dry-run,防止语法不兼容导致后续测试失真
最常被忽略的是:没人检查 autoload-dev 和 scripts 中引用的命令是否还在新依赖下可用 —— 比如 phpstan analyse 升级后参数变了,CI 里的 script 会静默跳过而非报错。

















