有效,但校验结果可能失败——verify-checksums只读composer.lock中的dist.sha256并比对vendor目录实际哈希,若镜像包与原始不一致(如未同步更新哈希),--strict模式即报错,表明“所装包与lock承诺不符”,此时应换镜像、切回官方源或确认同步状态。

镜像切换后 verify-checksums 仍有效吗
有效,但校验结果可能失败——verify-checksums 不关心你用的是 https://mirrors.aliyun.com/composer/ 还是官方源,它只读 composer.lock 里的 dist.sha256,然后重新计算 vendor/{package}/ 目录的实际哈希值。如果镜像返回的 dist 包和 Packagist 原始不一致(比如打了补丁但没更新 shasum),verify-checksums --strict 就会报错。
这不是命令失效,而是它在尽责地告诉你:“你装的包,和 lock 文件承诺的不一样”。此时该做的是:换镜像、切回官方源、或联系镜像维护方确认同步状态。
- 必须加
COMPOSER_EXPERIMENTAL=1,否则composer verify-checksums命令根本不存在 - 必须带
--strict,否则即使哈希不匹配也只警告、返回码仍是 0,CI 会误判成功 - 执行前确保
vendor/已存在且composer.lock是最新(即刚跑完composer install)
为什么镜像切换后 install 没报错但 verify-checksums 失败
composer install 只在校验刚下载的 zip/tar 包(解压前)是否匹配 composer.lock 中的 dist.sha256;而 verify-checksums 是真打开 vendor/ 目录,递归读所有文件(排除 .git、tests/ 等非发布路径),归并字节流再算一次 SHA256。两者校验时机和对象完全不同。
常见触发失败的场景:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 镜像源未严格同步 Packagist 的 dist 包,哈希“碰巧匹配”但内容已被替换
- 本地缓存被污染(如手动改过
~/.composer/cache/files/下的 zip) - 用了
--prefer-source或"type": "package",这类安装方式压根不走哈希校验流程 -
composer.lock是旧版生成的,没写dist.sha256字段(尤其常见于 Composer 2.3 之前生成的 lock)
如何快速定位 verify-checksums 报错的具体包
verify-checksums 报 Checksum mismatch 却不指明哪个文件?这是设计使然——它只做包级比对,不深入到单个 PHP 文件。要快速定位,得手动比对单个包:
- 用
composer show --locked vendor/package --format=json提取该包的dist.sha256值 - 进入
vendor/vendor/package目录,运行:find . -type f ! -name '.git*' ! -path './tests/*' -print0 | sort -z | xargs -0 shasum -a 256 | shasum -a 256 - 对比两次输出的 SHA256 是否一致;不一致说明该包目录内有文件被改动或增删
注意:别直接 shasum -a 256 . —— 目录本身不可哈希,必须先归并所有文件字节流再算。
生产部署前必须检查的三个硬性动作
仅靠 composer install 永远无法保证 vendor/ 完整。真正卡住部署的最小可靠组合是:
- 设
vendor/为只读:chmod -R a-w vendor/(防止运行时被覆盖或注入) - 断言
vendor/autoload.php未被篡改:grep -q "autoload_real\.php" vendor/autoload.php || exit 1 - CI 中固定执行:
COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict,且依赖其非零退出码中断流水线
容易被忽略的是:verify-checksums 不校验 vendor/composer/autoload_*.php 这类生成文件,也不校验 vendor/autoload.php 本身是否被替换——后者必须靠外部防护手段兜底。

















