直接运行composer show可查看实际安装的包及版本,它读取composer.lock或vendor中元数据,显示落地版本而非composer.json中的约束表达式;加--installed更明确,--tree显示完整依赖树。

composer install 后怎么看实际装了哪些包和版本?
直接运行 composer install 不会主动打印已安装的包列表和版本,它只显示“Installing dependencies”过程。想确认到底下了什么,得用专门的命令查锁定文件或当前安装状态。
最可靠的方式是看 composer.lock —— 它记录了每次 composer install 实际安装的精确版本(包括递归依赖),比 composer.json 更真实。
- 运行
composer show:列出所有已安装包及其当前版本(不含 dev 分支信息) - 加
--installed参数效果一样,但更明确:composer show --installed - 想查某个具体包(比如
monolog/monolog):composer show monolog/monolog,会显示版本、描述、依赖关系 - 如果
composer.lock存在但没执行过install(比如刚 clone 项目),composer show仍能读取 lock 文件并显示“已解析”的版本,但不保证本地已存在
为什么 composer show 显示的版本和 composer.json 不一致?
因为 composer.json 写的是版本约束(如 "^2.0"),而 composer.lock 记录的是实际解析出的确定版本(如 2.10.0)。composer show 默认读 lock 文件(如有)或 vendor 中已安装的包元数据,所以看到的是“落地版本”,不是约束表达式。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 若删掉
vendor/和composer.lock,再跑composer install,结果可能和之前不同——即使composer.json没改,新解析的依赖树可能选了更新的小版本 -
composer show -t可以显示依赖树,帮你确认某个包被谁拉进来、用了哪个版本 - 注意:如果项目没生成
composer.lock(比如从未 run 过 install 或 update),composer show会报错或只显示 root 包,无法反映完整依赖
如何快速对比两次 install 的包版本变化?
靠人工翻 composer.lock 太费劲,用 git diff 最直接——前提是这个文件被提交进仓库(强烈建议这么做)。
- 安装前先
git add composer.lock && git commit -m "before install" - 执行
composer install或composer update - 再运行
git diff composer.lock,就能清晰看到哪些包升级/降级/新增/移除 - 如果没开 git,可用
composer show --format=json导出 JSON,再用diff工具比对两次输出(注意排序问题) - 别依赖
composer outdated查历史差异——它只告诉你“当前有哪些可更新”,不反映上次 install 到现在的实际变更
composer install 没报错,但某些包版本不对,怎么排查?
常见原因是 composer.lock 被手动修改、损坏,或 PHP 环境/平台配置(如 platform config)影响了版本解析。
- 先验证 lock 文件完整性:
composer validate,检查是否语法错误或 hash 不匹配 - 强制重解依赖(忽略 lock):
composer install --ignore-platform-reqs或composer update --lock,看是否得到预期版本 - 检查是否启用了
minimum-stability或prefer-stable,它们会影响默认选版策略 - 运行
composer why-not vendor/package:version(例如composer why-not guzzlehttp/guzzle:7.8.0)可查某版本为何未被选用——常因上游约束冲突
真正落地的版本永远以 composer.lock + vendor/ 为准,而不是 composer.json 里写的波浪号或脱字符。任何跳过 lock 文件的操作(比如删 lock 后 install)都会导致不可控结果。










