如何通过Composer status命令查看本地项目改动详情?
- 内容介绍
- 文章标签
- 相关推荐
本文共计940个文字,预计阅读时间需要4分钟。
它根本没检查你修改的那个包。默认情况下,Composer 安装的绝大多数包都是 dist 模式(zip 解压)的,路径是 vendor/xxx 目录下,且该目录下没有 .git 文件。而 composer status 只扫描带有 .git 的目录——这也就是为什么即使使用了 --prefer-source 安装的包,也不会出现在列表中——因为这些包的实际安装目录是 src。
验证方式很简单:composer show monolog/monolog,如果输出里没有 source 字段,说明这个包当前就是 dist 模式,status 对它完全静音。
- 私有包若在
composer.json中漏写"type": "package"或没配"source",即使本地有 Git 仓库,Composer 也不会识别 -
prefer-dist是默认行为,90% 以上的 Packagist 包都走 zip 下载 - 想让它检测到修改,必须先重装为 source 模式:
composer update --prefer-source monolog/monolog
怎么让 composer status 真正显示 modified?
核心动作只有一个:把目标包切换成 source 模式。否则 status 就是摆设。旧的 dist 包不会自动转 source,必须重装。
推荐做法是统一配置:composer config prefer-source true,该命令会写入项目 composer.json 的 config 块,后续 install 或 update 都会默认拉 Git 仓库。
- 临时生效(比如 CI 场景):
composer install --prefer-source或composer update --prefer-source - 重装单个包:
composer update --prefer-source symfony/console - 改完后务必重新运行
composer status,否则看不到变化
看到 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 后字段顺序可能变,适合人眼扫,不适合写自动化脚本做判断。
composer status 显示 modified,但你确定没改代码?
常见原因不是你手动改了,而是依赖包自身在安装后执行了生成操作——比如 Symfony 缓存写入、Laravel 的 storage/framework 写入,或 Git 忽略规则没覆盖 vendor 下的某些临时文件。
另外,如果用 composer install --no-scripts 装过,某些包的 post-install-cmd 可能没执行,导致生成文件缺失,也会被识别为 “modified”。
运行前确认当前目录是项目根目录(含 composer.json),否则会报错或返回空;它只检查 vendor/ 下已由 Composer 安装的包,不检查 require-dev 里带 path 类型的本地包。
最易忽略的一点:composer status 默认静默成功——只有发现差异时才打印内容并返回非零退出码(1)。没有输出 ≠ 没运行,只是当前 vendor/ 和 composer.lock 完全一致。
本文共计940个文字,预计阅读时间需要4分钟。
它根本没检查你修改的那个包。默认情况下,Composer 安装的绝大多数包都是 dist 模式(zip 解压)的,路径是 vendor/xxx 目录下,且该目录下没有 .git 文件。而 composer status 只扫描带有 .git 的目录——这也就是为什么即使使用了 --prefer-source 安装的包,也不会出现在列表中——因为这些包的实际安装目录是 src。
验证方式很简单:composer show monolog/monolog,如果输出里没有 source 字段,说明这个包当前就是 dist 模式,status 对它完全静音。
- 私有包若在
composer.json中漏写"type": "package"或没配"source",即使本地有 Git 仓库,Composer 也不会识别 -
prefer-dist是默认行为,90% 以上的 Packagist 包都走 zip 下载 - 想让它检测到修改,必须先重装为 source 模式:
composer update --prefer-source monolog/monolog
怎么让 composer status 真正显示 modified?
核心动作只有一个:把目标包切换成 source 模式。否则 status 就是摆设。旧的 dist 包不会自动转 source,必须重装。
推荐做法是统一配置:composer config prefer-source true,该命令会写入项目 composer.json 的 config 块,后续 install 或 update 都会默认拉 Git 仓库。
- 临时生效(比如 CI 场景):
composer install --prefer-source或composer update --prefer-source - 重装单个包:
composer update --prefer-source symfony/console - 改完后务必重新运行
composer status,否则看不到变化
看到 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 后字段顺序可能变,适合人眼扫,不适合写自动化脚本做判断。
composer status 显示 modified,但你确定没改代码?
常见原因不是你手动改了,而是依赖包自身在安装后执行了生成操作——比如 Symfony 缓存写入、Laravel 的 storage/framework 写入,或 Git 忽略规则没覆盖 vendor 下的某些临时文件。
另外,如果用 composer install --no-scripts 装过,某些包的 post-install-cmd 可能没执行,导致生成文件缺失,也会被识别为 “modified”。
运行前确认当前目录是项目根目录(含 composer.json),否则会报错或返回空;它只检查 vendor/ 下已由 Composer 安装的包,不检查 require-dev 里带 path 类型的本地包。
最易忽略的一点:composer status 默认静默成功——只有发现差异时才打印内容并返回非零退出码(1)。没有输出 ≠ 没运行,只是当前 vendor/ 和 composer.lock 完全一致。

