composer install 默认不校验包完整性,仅检查 vendor/ 目录存在性和路径是否非空;真正校验需用 composer verify-lock(2.2+)或 composer install --no-cache 强制重下载并比对 shasum。

composer install 默认不校验已下载包的完整性,它只检查 composer.lock 中记录的哈希值是否与本地 vendor/ 下实际文件匹配——但前提是这些包是通过 Composer 自己安装或更新的,且未被手动修改过。
为什么 composer install 不会重新下载或校验已有文件?
Composer 的设计逻辑是:只要 vendor/ 目录存在、composer.lock 未变、且所有包的 install-path(如 vendor/foo/bar)目录非空,composer install 就跳过下载和解压,直接认为“已就绪”。它不会主动读取并比对每个文件的 SHA256 或 BLAKE2b 哈希。
- 它只在首次安装或
composer update后写入 lock 文件时,才记录包归档的哈希(来自 Packagist 的dist.shasum字段) - 后续
install阶段仅做轻量级路径存在性检查,不触发文件级校验 - 如果你手动改过
vendor/里的某文件,composer install完全感知不到
用 composer install --dry-run 能检测完整性吗?
不能。--dry-run 只模拟依赖解析和安装计划,不访问 vendor/ 文件内容,也不执行任何校验逻辑。它输出的是“如果运行,会装哪些包”,跟文件完整性无关。
- 它甚至不检查
vendor/是否存在 - 不会读取
composer.lock中的shasum字段 - 输出里完全不包含 “校验”“hash”“integrity” 类关键词
真正能检测完整性的命令只有 composer verify-lock
这是 Composer 2.2+ 内置的专用命令,它会:读取 composer.lock,提取每个包的 dist.shasum,然后尝试从本地 vendor/ 对应路径重建归档(tar 包),再比对哈希。但它有严格前提:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须使用 Composer 2.2 或更高版本(
composer --version确认) -
vendor/中的包必须是 Composer 原生安装的(即含.dist-info或原始压缩包缓存痕迹) - 若包是通过
path仓库或package方式声明的,没有dist.shasum,该命令直接跳过校验 - 运行后无输出 = 通过;报错如
Integrity check failed for "monolog/monolog"= 文件被篡改或损坏
示例:
composer verify-lock
更可靠的手动校验方式:删 vendor 后重装 + --no-cache
当怀疑本地文件已被污染(比如 CI 环境中多人共用缓存、或有人手动编辑过 vendor/),最稳妥的做法不是“检测”,而是强制重建:
-
rm -rf vendor composer.lock(可选,若要彻底重算依赖) -
rm -rf ~/.composer/cache/files/*(清空全局 dist 缓存,避免复用坏包) -
composer install --no-cache --ignore-platform-reqs(禁用缓存,强制重新下载并校验每个包的shasum)
注意:--no-cache 是关键——它让 Composer 忽略本地缓存,每次从 Packagist 拉取新归档,并在解压前校验其哈希是否与 composer.lock 一致。失败则中断,不会写入 vendor/。
真正容易被忽略的一点:哪怕你用了 verify-lock,它也只校验 dist 归档层(也就是 zip/tar 包),不校验安装后被 PHP 自动加载器或脚本修改过的文件(比如某些包在 post-install-cmd 里生成代码)。这类改动属于运行时行为,不在 Composer 校验范围内。










