Composer install/update 时自动校验 composer.lock 中 dist.shasum 与下载包 SHA256,不一致则中止并报错;--dry-run 不触发下载,故不校验哈希。

Composer lock 文件的哈希校验是自动触发的,不是手动运行某个命令验证
当你执行 composer install 或 composer update 时,Composer 会自动比对 composer.lock 中记录的包哈希(dist.shasum)与实际下载归档文件的 SHA256 值。如果不一致,会中止安装并报错:Invalid checksum for ...。它不会提供一个“只校验不安装”的独立命令。
想手动验证 lock 文件里某个包的哈希是否匹配远程归档?得自己取值比对
这属于调试或审计场景,比如怀疑 lock 文件被篡改、或想确认某次 CI 构建用的包没被污染。操作分三步:
- 从
composer.lock中找到目标包的dist.shasum字段值(注意:仅dist类型包有该字段,source类型无) - 拼出该包 dist 归档的真实 URL(通常在
dist.url字段,如https://api.github.com/repos/vlucas/phpdotenv/zipball/...),用curl -L -s下载到本地临时文件 - 用系统命令计算 SHA256:
shasum -a 256 /path/to/downloaded.zip,和 lock 文件里的值逐字符比对
注意:dist.shasum 是针对压缩包原始字节计算的,不是解压后内容;若包使用了私有仓库或自定义 installer,URL 可能不可达或需认证。
为什么 composer install --dry-run 不校验哈希?
--dry-run 只模拟依赖解析和安装路径,跳过所有网络请求和文件写入,自然也不会下载 dist 包、更不会算哈希。它只检查 composer.json 和 lock 的结构兼容性,比如 PHP 版本约束、平台配置是否冲突。真实哈希校验必须触发下载环节 —— 也就是至少执行一次非 dry-run 的 install 或 update。
CI/CD 中确保哈希校验生效的关键点
很多团队误以为只要 commit 了 composer.lock 就万事大吉,其实还有几个易忽略的坑:
- 不要在 CI 中用
composer install --no-scripts --no-plugins以外的禁用选项干扰校验流程 ——--ignore-platform-reqs不影响哈希,但--prefer-source会绕过dist.shasum校验(改用 git commit hash) - 确保 CI 环境时间准确,部分 HTTPS 证书校验失败会导致 dist 下载中断,从而跳过哈希比对(错误被掩盖成网络超时)
- 私有 Packagist 镜像若未正确透传
dist.shasum字段(比如用了过期的 Satis 版本),会导致本地校验始终失败
哈希校验本身很轻量,但它依赖整个下载链路完整可信 —— 从 lock 文件字段、镜像服务、网络中间件到本地 curl/OpenSSL 实现,任一环出问题,校验就形同虚设。











