生产环境部署必须用 composer install --no-install --dry-run 配合 composer validate --strict 校验一致性:前者比对 lock 与当前环境兼容性,后者验证 lock 文件完整性,缺一不可。

生产环境部署时,composer install 会跳过依赖解析,直接按 composer.lock 安装——但前提是这个 lock 文件必须和当前 composer.json、PHP 版本、平台配置完全匹配。稍有不一致,就可能静默降级、漏装、甚至装错版本,而你根本不会收到警告。
为什么 composer install --dry-run 不够用
很多人以为加 --dry-run 就能提前发现 lock 问题,其实它只模拟安装流程,不校验 lock 文件本身的合法性。比如:
-
composer.lock中记录了 PHP 8.2 特有的扩展约束(如"ext-pdo_pgsql": "^1.0"),但当前环境是 PHP 8.1 →--dry-run仍成功,实际install却失败 -
composer.json新增了一个 require,但没运行composer update→ lock 文件里没有该包 →--dry-run不报错,install直接跳过,导致运行时报Class not found
composer install --no-install --dry-run 的真实作用
这个组合命令才是真正做「一致性快照比对」的最小开销方式:它加载 composer.json 和 composer.lock,重建内存中的依赖图,再逐项比对 lock 中的 package 列表、版本、哈希、平台条件是否与当前环境兼容。它不下载任何包,也不写 vendor,纯校验。
推荐在 CI/CD 的部署前检查阶段使用:
- 确保 PHP 版本、扩展、
platform配置与 lock 文件声明一致 - 确认所有
require和require-dev(若启用)都已出现在 lock 中 - 检测 lock 文件是否被手动修改或 git 冲突残留(例如
content-hash不匹配)
执行后返回非零退出码即表示不一致,应立即中止部署。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
必须配合 composer validate --strict
composer validate 默认只检查 JSON 格式和基础字段,加 --strict 才会验证 lock 文件的完整性:
- 校验
content-hash是否与当前composer.json+composer.lock的实际内容匹配 - 检查每个 package 的
dist.sha256或dist.sha1是否存在且非空(防止 lock 被截断) - 拒绝 lock 文件中出现未声明在
composer.json中的 root-level 依赖(比如有人手改 lock 加了包)
注意:validate --strict 不检查 PHP 环境兼容性,必须和前面的 --no-install --dry-run 配合使用才完整。
CI/CD 中的典型检查顺序
别只跑一个命令。真实生产发布前,建议按这个顺序执行并全部通过:
-
composer validate --strict→ 确保 lock 文件结构合法、哈希未损坏 -
composer install --no-plugins --no-scripts --no-install --dry-run→ 确保 lock 可被当前环境解析且无缺失依赖 - (可选但强烈建议)
composer show --locked --format=json | sha256sum→ 记录本次 lock 的指纹,用于灰度比对
其中 --no-plugins 和 --no-scripts 是关键:避免插件或 post-install-cmd 干扰校验逻辑,让结果纯粹反映依赖一致性本身。
最容易被忽略的是 platform 配置——如果你在 composer.json 里写了 "platform": {"php": "8.2.0"},但部署机是 8.1.9,--dry-run 会直接失败;但如果没配 platform,lock 里又用了仅 PHP 8.2 支持的语法,错误就会延迟到运行时才暴露。

















