composer show 不记录历史,仅反映当前 vendor/composer/installed.json 快照状态;可靠历史依赖 composer.lock 文件及 Git 提交,或手动备份输出。

composer show 本身不记录历史,只反映当前状态
Composer 没有内置的“安装日志”或“变更时间线”,composer show 查的是 vendor/composer/installed.json 这个快照文件——它只告诉你现在装了什么、版本是多少,不告诉你昨天删过啥、上周升级过谁。
常见错误现象:运行 composer show 后发现某个包不见了,就以为“它被卸载了”,其实更可能是:composer.json 里删了那行、又没跑 composer install,或者执行了 composer update --with-dependencies 导致间接依赖被移除。
-
composer.lock是唯一可靠的历史线索:它记录每次composer install/update后所有包的精确版本和哈希值;用git log -p composer.lock能看到每次变更 - 如果没开 Git,或
composer.lock被覆盖过,就真的没历史可查了——Composer 不会在本地留操作痕迹 - 想回溯某次安装前的状态?只能靠备份
vendor/或提前导出composer show --installed --no-ansi > before.txt
如何用现有命令逼近“最近一次变更”
虽然没有 composer history,但你可以组合几个命令,快速定位“刚发生了什么”:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 对比当前与上一次
composer.lock:git diff HEAD~1 -- composer.lock | grep -E "^\+|^-",重点关注"packages"和"packages-dev"区块增删 - 查哪些包版本变了:
composer show --installed --no-ansi | sort > now.txt,再跟上次存的before.txt做diff now.txt before.txt - 看最近一次
composer update装了啥:composer update --dry-run不真执行,但会打印将要更新/降级/安装的包(注意:它基于当前composer.json和锁文件推演,不一定等于上次实际行为)
为什么不能依赖 vendor/ 文件夹判断“是否装过”
vendor/ 目录不是权威来源——它可能残留旧包、被手动删过、或因 --no-install 未真正解压。真正决定“已安装”的是 installed.json 和自动加载器能否识别。
- 一个包出现在
vendor/但composer show vendor/package报错?说明它没被 Composer 记录,可能是手动拷进去的,或composer install中断导致元数据不全 -
composer show --tree输出里没它,但ls vendor/vendor/package看得见?大概率是脏环境,建议清空vendor/+composer install重建 - CI/CD 中排查差异时,永远优先比对
composer show --installed --no-ansi输出,而不是ls vendor/
全局包和项目包必须分开查,混用会漏信息
很多人在项目目录下跑 composer show,却想确认 phpunit/phpunit 是否全局装了——这是徒劳的。composer show 只看当前项目的 vendor/,而全局包装在用户主目录的 ~/.composer/vendor/ 下。
- 查项目依赖:
composer show --installed --no-ansi - 查全局工具:
composer global show --installed --no-ansi - 查某包是否在任一环境存在:
composer show vendor/package 2>/dev/null || composer global show vendor/package 2>/dev/null - 注意:
composer global show不受当前目录影响,哪怕你在/tmp下也能运行;而composer show必须在含composer.json的项目根目录下
真正难的不是“怎么查”,而是意识到 Composer 从不保存操作日志——所有“历史”都得靠你主动留痕:commit composer.lock、定期导出 composer show 结果、避免手动动 vendor/。否则哪天要还原,就只剩猜了。

















