composer install --dry-run 是确认 vendor 未被篡改的最直接方式,输出 “nothing to install or update” 表明 vendor 与 composer.lock 完全一致;更严格可结合 composer clear-cache && composer install --no-cache 强制重拉校验。

composer install 后怎么确认 vendor 里的包没被篡改
安装完依赖不能只看 vendor/ 目录存在就放心——composer install 默认不校验已下载包的完整性,一旦缓存污染、网络中断或磁盘故障,vendor/ 里可能残留损坏或不一致的文件。
真正可靠的校验方式是让 Composer 主动比对 composer.lock 中记录的哈希值:
- 运行
composer install --dry-run:它会跳过实际安装,只检查 lock 文件与 vendor 是否匹配,输出中出现Nothing to install or update才说明完全一致 - 更严格的做法是先清缓存再重装:
composer clear-cache && composer install --no-cache,强制从源重新拉取并校验(注意:这会变慢,但能排除本地缓存干扰) - 如果项目有 CI 流程,建议在构建阶段加一步:
composer validate --strict检查composer.json格式 +composer show --locked输出是否与预期一致(可配合 diff 工具做断言)
为什么 composer.lock 里的 sha256 不等于 vendor 文件的实际 hash
composer.lock 中每个包的 dist.shasum 字段不是对解压后整个目录算的哈希,而是对原始压缩包(zip/tar)的完整二进制内容计算的 sha256。所以你用 shasum -a 256 vendor/package/dist.zip 能对上,但对 vendor/package/src/ 下任意文件做哈希肯定不等。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
这意味着:
- 别手动去
vendor/里挨个算子目录哈希来“验证”,那毫无意义 - 如果你修改了 vendor 里的代码(比如临时 patch),
composer install --dry-run会立刻报错,提示文件不匹配——这是设计使然,不是 bug - 想长期修改某包?应该 fork 它、打 tag、然后在
composer.json的repositories里指向你的 Git 地址,而不是硬改 vendor
如何检测 vendor 是否混入了未声明的文件或恶意代码
Composer 不负责扫描病毒或识别隐藏文件,它只管自己下载和解压的路径。容易被忽略的风险点:
-
vendor/下可能出现.git目录(某些包发布时误打包了 Git 元数据),可用find vendor -name ".git" -type d快速排查 - 某些包的
install脚本(如post-install-cmd)可能执行任意命令,检查composer.json的scripts字段及依赖包的composer.json是否含可疑命令 - 国内镜像源若配置错误(比如写成
repos.packagist.url而非repos.packagist.org.url),会导致 Composer 回退到官方源,但你并不知情——必须用composer config -v repo.packagist.org确认来源,并用composer require monolog/monolog -vvv 2>&1 | grep "GET https"看真实请求地址
CI/CD 中自动校验依赖完整性的最小可行方案
不需要引入额外工具,纯 Composer 命令就能覆盖大部分风险:
- 第一步:
composer validate --strict确保composer.json语法和字段合法 - 第二步:
composer install --no-dev --dry-run(生产环境用)或composer install --dry-run(开发环境用),确认 lock 和 vendor 一致 - 第三步:
composer show --locked --format=json | jq -r '.packages[] | select(.type == "library") | .name' | sort > expected-packages.txt,再对比当前ls vendor/ | sort,防止意外多出未声明的目录 - 关键提醒:所有这些命令都必须在
composer.lock已提交到 Git 的前提下运行,否则校验失去意义










