verify-checksums --strict是唯一能真正校验vendor文件一致性的命令,它逐包读取vendor目录实际文件(排除.git、tests/等)、计算SHA256并与composer.lock中dist.sha256比对;其他命令均不访问磁盘文件,且该命令需COMPOSER_EXPERIMENTAL=1启用。

composer install 本身不校验已安装 vendor 的文件一致性,只在校验下载的 dist 包时做一次 SHA256 比对;分布式环境里所谓“校验通过”,往往只是跳过了真正要查的问题。
为什么 --verify-checksums --strict 是唯一能用的校验命令
它才是真正打开 vendor/ 目录、递归读所有源码文件(排除 .git、tests/ 等非发布路径)、合并字节流再算 SHA256,并和 composer.lock 中的 dist.sha256 字段逐包比对的机制。其他命令全都不碰磁盘文件:
-
composer install只在校验刚下载的 zip/tar(解压前)是否匹配 lock 文件,装完就不管了 -
composer validate只检查 JSON 格式和 lock 内部 hash 字段,完全不读 vendor -
composer show --installed只输出包名和版本,不计算任何哈希值 - 不设
COMPOSER_EXPERIMENTAL=1,composer verify-checksums命令根本不会出现在composer list里
分布式节点上 verify-checksums 失败的常见真实原因
不是命令写错了,而是环境或操作本身绕过了校验前提:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用了
--prefer-source或私有type: "package",这些包在composer.lock里没有dist.sha256字段,verify-checksums直接跳过,但你可能根本没意识到漏检了 -
vendor/autoload.php被手动改过(比如加了调试代码或恶意 payload),它不在生成文件列表里,却会被verify-checksums扫到并报错 - CI 构建时复用了本地缓存,而缓存里是旧版坏包 ——
install阶段没触发校验,verify-checksums却暴露了问题 - 某些边缘节点开了
follow_symlinks = false,导致--optimize-autoloader生成的 classmap 不全,verify-checksums虽不校验 classmap 文件,但运行时类加载失败会让你误以为是哈希问题
CI/CD 流水线中必须组合使用的三步校验
单靠一个命令无法覆盖分布式场景的所有破坏路径:
- 构建开始前:用
composer show --installed --format=json | jq -r '.[] | "\(.name) \(.distReference)"'提取当前 vendor 实际 dist 引用,再和jq -r '.packages[] | "\(.name) \(.dist.reference)"' composer.lock输出排序后diff—— 有差异说明 lock 和 vendor 已脱钩 - 部署前清空
vendor/,执行composer install --no-dev --prefer-dist --no-cache,强制重装并触发 dist 包下载时的原始 SHA256 校验 - 安装完成后立即跑:
COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict,且必须检查其退出码 —— 非 0 就中断发布
最容易被忽略的是:verify-checksums 不校验 vendor/composer/autoload_real.php 这类生成文件,也不管 autoload.files 里声明的手动引入文件是否被篡改。生产环境得额外加一层防护,比如 chmod -R a-w vendor/,再用 grep -q "autoload_real\.php" vendor/autoload.php 断言入口文件未被替换。

















