不能。composer install --dry-run 仅检查依赖能否解析,不校验 vendor 目录内容是否与 composer.lock 完全一致,无法发现手动修改或缺失包等不一致情况。

composer install --dry-run 能不能验证 lock 文件一致性?
不能。它只检查依赖能否解析,不校验已安装的 vendor 是否和 composer.lock 完全一致——比如你手动删了某个包、改了 vendor/ 里的文件,composer install --dry-run 依然会成功。
真正需要的是「比对当前 vendor 状态与 lock 文件声明是否完全吻合」,这得靠 composer install --no-install 配合其他手段,但更直接的是用 composer validate 和实际校验逻辑组合。
-
composer validate只检查composer.json和composer.lock的格式与基本兼容性(比如 lock 中的 hash 是否存在),不涉及 vendor 目录内容 - CI/CD 中真正有效的做法是:先清空
vendor/,再跑composer install --no-dev --prefer-dist,然后用git status --porcelain vendor/或校验脚本确认无变更 - 如果已有
vendor/,可用composer show --installed --format=json导出当前安装状态,再和composer.lock的packages字段做哈希或版本比对(需写简单脚本)
为什么 CI/CD 必须重新 install 而不是 trust 现有 vendor?
因为 CI 环境不可信:缓存可能被污染、镜像源返回异常包、本地修改未清理、甚至上一次构建残留了 dev-only 包。靠「有没有 vendor」或「有没有报错」来判断 lock 一致性,等于把校验权交给了运气。
- CI 步骤中应始终从干净状态开始:
rm -rf vendor composer.lock不行,必须保留composer.lock,只删vendor/ - 执行
composer install --no-dev --prefer-dist --quiet后,立刻检查退出码;非 0 表示 lock 文件声明的依赖无法满足(例如平台配置冲突、包已被移除) - 加
--dry-run在 CI 里是无效动作——它跳过下载和解压,也就跳过了真实校验环节
如何用 shell 快速检测 vendor 是否和 lock 完全一致?
不需要重装,只需比对「lock 文件记录的每个包的 dist reference」和「vendor 中对应目录的实际 commit hash 或 zip 哈希」。Composer 自身不提供现成命令,但可借助 composer show --installed --format=json 和 jq 提取关键字段。
- 运行
composer show --installed --format=json | jq -r '.[] | "\(.name) \(.distReference)"'得到当前 vendor 中各包的实际 dist 引用 - 从
composer.lock中提取相同字段:jq -r '.packages[] | "\(.name) \(.dist.reference)"' composer.lock - 两组输出排序后用
diff比对:diff ,有输出即不一致 - 注意:若包使用
source方式安装(如 path repo),dist.reference为空,需额外处理source.reference
GitHub Actions / GitLab CI 中最简可靠的 lock 校验写法
别依赖第三方 Action,用原生命令链最稳。核心就两步:确保 lock 存在 + 确保 install 不产生变更。
- 先检查
composer.lock是否被修改但未提交:git status --porcelain composer.lock,有输出就失败 - 再执行
composer install --no-dev --prefer-dist --quiet,紧接着运行git status --porcelain vendor/;若有输出,说明 vendor 和 lock 不匹配(比如 lock 锁的是旧版,但 vendor 是新版) - 为防误判,加一句
git checkout -- vendor/再重试 install,避免因上一次失败残留导致误报 - PHP 版本必须和 lock 中
platform.php一致,否则composer install可能静默降级某些包,造成一致性漏检
最麻烦的点其实不在命令本身,而在于 lock 文件里混用了 dist 和 source 安装方式,或者用了 path repo —— 这些情况会让哈希比对失效,只能靠重装+diff vendor 目录来兜底。










