composer status 不报修改的根本原因是它仅检测 source 安装的包(含 .git 目录),而默认 prefer-dist 下绝大多数包为 zip 解压安装,vendor 中无 .git,故无法比对;即使手动修改 dist 包文件,status 也完全无感。

composer status 为什么没报修改,但 vendor 里明明改了?
根本原因不是命令失效,而是 composer status 只能检测以 source 方式安装 的包(即带 .git 目录的 Git 克隆),对 dist 安装(zip 包解压)完全无感。
- 默认行为是
"prefer-dist": true,绝大多数包走的是 zip 下载,vendor/xxx下没有.git,自然无法比对 - 运行
composer show package/name,如果输出里没有source字段,说明这个包当前就是 dist 模式 - 私有包若在
composer.json中漏配"type": "package"或未声明"source",即使你本地有 Git 仓库也无效
怎么让 composer status 真正起作用?
得先让目标包变成 source 模式,否则 status 就是睁眼瞎。
- 重装单个包:运行
composer update --prefer-source vendor/package - 全局强制 source:加
--prefer-source到install或update,例如composer install --prefer-source - 永久配置(推荐团队统一):在项目根目录执行
composer config prefer-source true,会写入composer.json的config块
看到 modified 后,怎么快速定位改了啥?
composer status -v 只列出文件路径,不显示差异内容;真要看改动,必须进到对应包的 Git 仓库里用 git 命令。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 手动流程:先
composer status -v→ 找到包名(如monolog/monolog)→cd vendor/monolog/monolog→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后字段顺序可能变),别用它写自动化脚本做判断,只适合人眼扫
status 空输出就代表 vendor 干净吗?
空输出只说明「所有 source 安装的包都没被改」,不代表整个 vendor/ 绝对干净。
- dist 安装的包哪怕被删了文件、改了代码,
status也不会报——它压根不检查它们 - 有些包虽然用了 source,但你
git checkout .清过工作区,或git clean -fd过,status也会沉默 - CI/部署前想真正验“一致性”,更可靠的是
composer install --no-dev --dry-run+ 校验composer.lock是否被篡改
真正难的不是运行命令,而是理解它背后依赖的是 Git 工作区状态,而不是文件哈希或 lock 快照。一旦忘了这点,就容易误判“没问题”。










