composer status 不是全量审计工具,仅检测 --prefer-source 安装且含 .git 的包是否修改;对 --prefer-dist 包(占90%)完全静音,空输出不表示 vendor 干净,vendor/autoload.php 等生成文件也不在校验范围内。

composer status 不是代码变更审计工具
它只检查 vendor/ 下以 --prefer-source 方式安装、且含 .git 目录的包是否被本地修改,对 90% 默认走 --prefer-dist(zip 解压)的包完全静音。空输出 ≠ vendor 干净,只是“没扫描到 source 包改动”。
常见误判场景:
-
composer show monolog/monolog输出里没有source字段 → 该包 status 根本不检测 - 私有包漏配
"type": "package"或"source"→ 即使本地有 Git 仓库,Composer 也不识别 -
vendor/autoload.php被篡改 → status 完全不校验生成文件,毫无反应
想用 status 真正看到 modified,必须先切 source 模式
默认 dist 模式下,status 对绝大多数包无效。要让它起作用,得让目标包带 .git:
- 重装单个包:
composer update --prefer-source monolog/monolog - 项目级统一配置:
composer config prefer-source true(写入composer.json的config块) - 临时生效(如 CI):
composer install --prefer-source
注意:旧的 dist 包不会自动转换,必须显式重装;且系统 PATH 中必须有 git 命令,否则 fallback 回 dist。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
看到 modified 后,怎么定位具体改了什么?
composer status -v 只输出包名和“X files modified”,不提供 diff 内容。真要看改动,得进目录手动查:
- 先确认包名:
composer status -v | grep "modified" - 再进目录:
cd vendor/symfony/console - 用 Git 查差异:
git diff --stat或git status -s
一行脚本批量查(Linux/macOS):composer status | grep "modified" | cut -d' ' -f1 | xargs -I{} sh -c 'echo "\n=== {} ==="; cd vendor/{} && git status -s 2>/dev/null'
注意:status 输出格式不稳定,不适合自动化逻辑判断。
真正可靠的依赖变更审计,得靠 composer.lock + git diff
composer.lock 是唯一记录实际安装状态的权威文件。想还原某次更新到底改了什么,不能依赖 status,而应:
- 用
git diff HEAD~1 composer.lock查历史变动 - 聚焦过滤关键字段:
git diff --no-color HEAD~1 composer.lock | grep -E '^\+ {4}"(name|version|dist.shasum|source.type)' - 重点盯
content-hash是否变化(变了说明依赖图真实不同) - 发现
"version": "dev-main"或"reference": "abc123"→ 必须人工确认是否合理
audit、check-platform-reqs、validate 这些命令才是面向安全与兼容性的正向审计手段;status 只是一个窄口径的、source-only 的本地修改提示器,容易被当成“全量审计”误用。










