composer status 不报 modified 是因仅检测 --prefer-source 安装且含 .git 的包;--prefer-dist(默认)安装的包无 .git,故跳过校验,即使被修改也静默。

composer status 为什么有时不报 modified,但 vendor 确实被改了
它根本没检查你改的那个包。composer status 只对以 --prefer-source 方式安装、且目录下存在 .git 的包生效;默认走 --prefer-dist(zip 解压),vendor/monolog/monolog 下压根没 .git,自然跳过校验。
验证方式很简单:composer show monolog/monolog,如果输出里没有 source 字段,说明这个包当前就是 dist 模式,status 对它完全静音。
- dist 包:靠
composer.lock中的dist.shasum校验,但默认不启用——必须加-v - 私有包若漏配
"source"或"type": "package",即使本地有 Git 仓库,Composer 也不识别 - path repository 类型的本地包,
status直接跳过,不参与任何比对
如何让 composer status 真正检测到修改
核心动作只有一个:把目标包切换成 source 模式。否则 status 就是摆设。
- 重装单个包:
composer update --prefer-source monolog/monolog - 全局强制 source(推荐团队统一):
composer config prefer-source true,该配置会写入项目composer.json的config块 - 临时生效(CI 场景):
composer install --prefer-source或composer update --prefer-source
注意:改完后要重新运行 composer status,旧的 dist 包不会自动转 source,必须重装。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
看到 modified 后,怎么快速定位改了啥
composer status -v 只告诉你“哪个包被改”和“路径”,不显示实际差异。真要看改动,必须进到包目录用 Git 命令。
- 手动流程:
composer status -v→ 找到包名(如symfony/console)→cd vendor/symfony/console→git status -s或git diff --stat - 一行脚本查所有 modified 包的简略状态(Linux/macOS):
composer status | grep "modified" | cut -d' ' -f1 | xargs -I{} sh -c 'echo "\n=== {} ==="; cd vendor/{} && git status -s 2>/dev/null' - 别依赖
composer status的输出格式做自动化判断——加-v后字段顺序可能变,适合人眼扫,不适合解析
空输出 ≠ vendor 干净
composer status 空输出只代表「所有 source 安装的包都没被改」,不代表整个 vendor/ 是干净的。
比如你改了一个 dist 包里的 src/Helper.php,但没加 -v,它就完全沉默;或者你加了 -v,但 PHP 缺少 hash 扩展,dist.shasum 校验直接跳过。
更底层、更稳的方式是直接用 git:find vendor/ -name '.git' -execdir sh -c 'echo "\n== {} =="; git status --porcelain' \; —— 这绕过了 Composer 的所有前提假设,只认真实 Git 状态。

















