composer install 断网会报错,无法直接校验本地 vendor 完整性;可用 --no-install 校验 lock 与 installed.json 一致性,composer show --installed 查已装包列表,再比对 shasum 防篡改。

composer install 时断网会直接报错,没法验证
断网状态下 composer install 会卡在包下载或元数据拉取阶段,比如报 Could not fetch https://repo.packagist.org/packages.json 或 Failed to decode response。它不提供“只校验本地 vendor 是否完整”的开关——默认行为就是边查 lock、边下包、边装,三步绑死。
用 composer install --no-install 临时绕过下载
这个参数会让 Composer 跳过安装步骤,只做依赖解析和 lock 文件校验,但前提是本地已有 vendor/ 目录且 composer.lock 没被改过。实际效果是:它会检查 vendor/ 下每个包的 installed.json 是否匹配 lock 中的版本和哈希,不联网也能跑完。
- 必须先确保
vendor/是之前联网时完整安装出来的(不是部分失败后残留的) - 运行前删掉
vendor/composer/installed.json会导致校验失败,别手抖 - 如果 lock 文件里有 dev 分支引用(如
"dev-main"),而本地 vendor 里对应包是 commit-hash 安装的,校验可能误报不一致 - 命令是:
composer install --no-install,不是--dry-run(后者根本不读 vendor)
更可靠的离线校验:用 composer show --installed
composer show --installed 本质是读取 vendor/composer/installed.json 并格式化输出,不触网、不解析 lock、不校验哈希,但它能快速告诉你“当前 vendor 里到底装了啥”。结合人工比对 lock 文件,就能判断是否缺失。
- 输出里每行是
vendor/package version,和composer.lock的packages数组顺序基本一致,肉眼比对可行 - 如果某个包在 lock 里有、但
composer show --installed不显示,说明它根本没进 vendor - 注意:
composer show --installed不校验文件完整性(比如某包被删了一半),只确认目录存在且有合法 installed.json - Windows 下 PowerShell 可能因编码问题显示乱码,建议用 Git Bash 或
composer show --installed --format=json后用 jq 处理
真正想离线验证完整性和一致性,得靠 vendor 哈希校验
Composer 本身不提供离线哈希校验命令,但 composer.lock 里每个包都有 dist: shasum 字段,而实际安装后,vendor/composer/installed.json 里也存了对应 dist-sha256(或 shasum)。两者不一致,说明包被篡改或损坏。
- 手动比对太累,可以用脚本提取 lock 和 installed.json 里的 shasum 做 diff(Python/PHP 都行,几行就搞定)
- 如果项目用了
composer install --prefer-dist(默认),dist 包的哈希才有效;若用了--prefer-source,就得比对 git commit hash,而installed.json里字段名是source-reference - 很多 CI 环境会删掉
vendor/composer/installed.json以减小镜像体积,这种情况下连基础校验都做不了
composer install --no-install 看是否报依赖冲突,再用 composer show --installed 确认包列表,最后按需比对 shasum —— 三步里任何一步失败,都说明 vendor 不可信。哈希校验那步最容易被跳过,但恰恰是防文件损坏的最后一道关。










