composer outdated 显示当前已安装但存在新版的 require 包,含版本对比及是否含重大变更;默认不检查 require-dev 和私有/VCS 包,结果受版本约束、缓存、Packagist 同步及仓库配置影响。

composer outdated 显示哪些包过期了
直接运行 composer outdated 就能看到所有已安装但有新版可用的包,包括当前版本、最新稳定版、是否含重大变更(如 semver-major 标记)。它默认只检查 require 里的包,不包含 require-dev。
常见错误是以为“没输出=全是最新的”,其实可能因为:
– 当前 composer.json 锁定了旧版本(version 字段写死或用了 ~/^ 但上游还没发符合规则的新版)
– 包本身已弃用,作者不再发新 tag,但 outdated 仍会显示“无更新”(不是 bug,是没新 release)
– 你本地没执行过 composer update --dry-run,缓存未刷新,结果滞后
- 加
--direct只看composer.json明确声明的依赖,排除传递依赖干扰 - 加
--minor-only或--patch-only过滤更新类型,避免误升major版本 - 想连
dev包一起查?用composer outdated --all
composer show -l 列出所有已安装包及版本号
composer show -l 是比 outdated 更底层的视图:它不判断“该不该升”,只忠实输出 vendor/composer/installed.json 里记录的实际安装版本。适合用来交叉验证 outdated 是否漏报,或排查为什么某个包明明发了 v2.1.0,你却还卡在 v2.0.0。
典型场景:
– CI 流程中需要固化当前依赖快照,用 composer show -l --format=json 导出结构化数据
– 发现某包升级后行为异常,先确认它是不是真装上了新版本(有时 update 失败但没报错,实际没变)
- 输出不含颜色,适合管道处理,比如
composer show -l | grep "guzzlehttp/guzzle" - 注意它不检查 Packagist 上的最新版,纯本地状态快照
- 如果
show -l和outdated对同一包结论矛盾,大概率是composer.lock没提交或被手动改过
composer update --dry-run 看升级实际影响范围
composer update --dry-run 不真正安装,但会模拟整个依赖解析过程,告诉你如果现在运行 update,会升哪些包、降哪些包、删哪些包,甚至提示冲突(比如 “Your requirements could not be resolved”)。这是上线前必须走的一步,比单纯看 outdated 严谨得多。
容易踩的坑:
– 忘了加 --with-all-dependencies,导致只升顶层包,而它的子依赖仍卡旧版(尤其当子依赖有 BC break 时很危险)
– 在 CI 中跑 --dry-run 却没设 COMPOSER_MEMORY_LIMIT=-1,大项目直接 OOM 退出,误判为“无变更”
– composer.json 里用了 minimum-stability: dev,--dry-run 可能拉取不稳定分支,本地开发没问题,但生产环境不允许
- 想预览某一个包升级?用
composer update --dry-run vendor/package-name - 配合
--verbose能看到具体哪条约束阻止了某个包升级(比如 “doctrine/dbal 3.6.0 requires php >=8.1.0”) - 如果
--dry-run报错但你确定要升,别硬上,先用composer why-not vendor/package:new-version查根因
为什么 composer outdated 有时不显示该升的包
最常被忽略的是版本约束写法。比如 "monolog/monolog": "2.8.*" 看似宽松,但 Composer 解析时等价于 "^2.8.0",而 monolog v2.9.0 发布后,它确实会被 outdated 列出;但如果写成 "2.8.0"(固定版本),哪怕 v2.9.0 已发布,outdated 也认为“满足要求”,不提醒——它只对比当前锁定版本和 Packagist 上符合你约束的最新版。
另一个隐形因素:Packagist 的元数据同步延迟。作者 push tag 后,通常几秒内可见,但偶尔卡住,outdated 就查不到。此时可临时用 composer clear-cache && composer outdated 强刷。
- 私有包或 VCS 包不会出现在 Packagist,
outdated默认不查它们,需确保repositories配置正确且在线 - 如果你用
composer config --global repo.packagist.org false关了官方源,outdated就完全失效 - 某些包在
composer.lock里标记了"source": {"type": "git", ...},outdated会跳过检查——它只认 Packagist 发布的 tag










