不能直接用 composer show 做 vendor 差异对比,因其读取当前 vendor/ 目录状态而非 composer.lock 快照,易混入手动修改、dev-only 包或 path repo 变更;且输出受终端宽度、排序逻辑影响导致结构不一致,diff 误报大量虚假变化。

为什么不能直接用 composer show 做 vendor 差异对比
它读的是当前 vendor/ 目录状态,不是锁文件快照——本地手动改过某包、dev-only 包残留、path repo 未提交的修改,都会混进去。终端宽度不同、排序逻辑差异(字母序 vs 深度优先),两次 composer show 输出结构就可能不一致,diff 出一堆“变化”,实际一个包都没动。
composer-lock-diff 是最贴近需求的工具
它不依赖 vendor/ 目录存在,也不需要 PHP 运行时,纯解析两个 composer.lock 文件的 JSON 结构,输出人类可读的四类变更:「新增」「删除」「升级」「降级」,并标出是否影响自动加载(autoload change)。
- 全局安装:
composer global require clue/composer-lock-diff,确保~/.composer/vendor/bin在$PATH中 - 备份旧 lock:
cp composer.lock composer.lock.bak,再执行composer update - 对比命令:
composer-lock-diff composer.lock.bak composer.lock - CI 场景下可直读 Git 历史:
git show HEAD~1:composer.lock | composer-lock-diff - composer.lock
中文环境下要注意的编码与路径问题
composer-lock-diff 本身不处理文件名编码,但若 lock 文件里含中文包名(极少见)、或你本地 Git 配置用了 core.autocrlf 或 core.quotePath,可能导致 diff 输出乱码或路径识别异常。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 检查 Git 配置:
git config --get core.autocrlf,建议设为false(尤其 Windows 环境) - 确认 lock 文件是 UTF-8 无 BOM 编码,可用
file -i composer.lock验证 - 避免在路径中使用中文空格、全角符号;Composer 对路径中非 ASCII 字符支持有限,
vendor-dir配置也应避开中文目录名
别把 vendor/ 目录本身当对比对象
有人想直接 diff -r vendor/ old-vendor/,这不可靠:Composer 不保证文件系统层级完全一致(比如 symlink 处理、.gitignore 影响、post-install-cmd 脚本生成的临时文件),且无法区分“是版本变更导致的差异”还是“只是缓存或 IDE 生成的垃圾”。真正有意义的差异,只存在于 composer.lock 的哈希、版本、require 关系中。
真正要排查 vendor 是否被篡改,该用 COMPOSER_EXPERIMENTAL=1 composer verify-checksums --strict,而不是比目录结构。

















