composer install --dry-run 无法校验环境一致性,它仅做依赖解析预演,不触碰 vendor、不校验已装包内容,也不比对 lock 文件与当前 vendor 是否一致;真正有效的方法是清空 vendor 后执行完整 install 并比对结果。

直接说结论:用 composer install --dry-run 无法校验环境一致性,它只做依赖解析预演,不触碰 vendor、不校验已装包内容,更不会比对 lock 文件和当前 vendor 是否一致。
为什么 composer install --dry-run 在 CI/CD 里是无效校验
它只是走一遍依赖解析流程,输出“将要安装哪些包”,但跳过下载、解压、写文件、生成 autoload、执行脚本等所有真实动作。哪怕你手动删了 vendor/symfony/console,composer install --dry-run 依然成功退出,完全无法发现不一致。
- 它不读
vendor/composer/installed.json,所以不知道当前实际装了什么 - 它不校验 dist 包哈希,无法发现本地缓存被污染或 zip 被篡改
- 它不检查平台扩展(如
ext-gd)是否缺失,而真实install会在此卡住 - CI 环境中若已有脏缓存或残留
vendor/,--dry-run会给出完全错误的“安全”信号
真正能校验开发环境一致性的做法
必须让 Composer 执行一次「干净、完整、可验证」的真实安装,并确认结果与 composer.lock 完全吻合。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先清空
vendor/(但保留composer.lock和composer.json) - 运行
composer install --no-dev --prefer-dist --quiet --no-interaction - 检查退出码:非 0 表示 lock 声明的依赖无法满足(比如平台不兼容、包已被移除)
- 再用
composer show --installed --format=json | jq -r '.[] | "\(.name) \(.version)"'提取已装包列表,和composer.lock的packages字段逐条比对版本与哈希(需脚本辅助) - 若用 Git 管理,还可加一步:
git status --porcelain vendor/,应返回空——说明没任何意外变更
composer require --dry-run 的合理用途在哪
它不是环境校验工具,而是「变更影响预览器」,适用于开发阶段的轻量决策。
- 想加一个新包,但不确定会不会触发其他包升级?运行
composer require monolog/monolog --dry-run - 同事提 PR 改了
composer.json的require,你本地快速跑一遍--dry-run就能看出是否引入冲突或降级 - CI 中集成在 pre-merge 阶段,作为第一道依赖兼容性过滤,但不能替代最终的
install校验 - 注意:它不检测运行时兼容性(比如 PHP 8.3 新语法在 8.1 上崩),只反映 Composer 解析层逻辑
真正难的不是命令怎么敲,而是得接受一个事实:环境一致性没有捷径。所谓「校验」,本质就是重装一次并确认结果可重现——任何跳过这步的检查,都是在赌运气。

















