composer outdated 默认仅显示语义化版本不兼容的更新,需加 --all 查看补丁更新,插件需用 composer show -l 确认是否激活,监控推荐 composer outdated --direct --minor-only --format=json。

composer outdated 显示所有过时包
直接运行 composer outdated 就能看到当前项目里所有可更新的依赖,包括插件(即 composer plugin 类型包)。它默认只显示语义化版本不兼容的更新(比如 ^2.1 锁在 2.1.3,但有 2.2.0 了),不显示小版本补丁(如 2.1.4)——除非你加 --minor-only 或 --patch-only。
常见错误现象:composer outdated 没输出?大概率是没装 composer-plugin-api 兼容的插件,或者插件本身没声明 type: composer-plugin;也可能是项目根目录下没有 composer.json。
- 加
--direct只看require和require-dev里直写的包,排除传递依赖 - 加
--all强制显示所有可更新项(含 patch 版本),适合做安全巡检 - 加
--format=json输出 JSON,方便脚本解析,比如监控系统自动抓取
composer show -l 列出已安装插件
插件不是普通包,有些不会出现在 composer outdated 默认结果里,尤其是通过 composer-plugin-api 注册、不走常规 autoload 的轻量插件。这时得用 composer show -l 看实际加载了哪些插件及其版本。
使用场景:CI 流水线中确认某个构建插件(如 hirak/prestissimo 或 phpstan/extension-installer)是否生效;或排查“为什么某个命令突然没了”——可能插件被卸载但配置还留着。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
composer show -l输出里带[plugin]标记的才是真插件 - 如果某插件在
composer.json的require里,但show -l不显示,说明它没被正确激活(常见于未执行composer install或插件类名注册失败) - 注意
composer show默认查的是已安装包,不是锁文件里的版本;想比对锁文件用composer show --outdated(等价于outdated)
监控过时插件的可靠方式
单纯靠人手动跑 composer outdated 不适合长期监控。真正能进 CI 或定时任务的,得靠结构化输出 + 明确退出码。
性能影响很小,但要注意:每次执行都会触发 composer.lock 解析和远程元数据检查(除非加 --no-plugins 关闭插件,但这会漏掉插件自身更新)。
- 推荐命令:
composer outdated --direct --minor-only --format=json 2>/dev/null,然后用jq 'length > 0'判断是否有待更新项 - 避免用
composer update --dry-run做监控:它会尝试计算完整依赖图,慢且容易因网络或平台配置失败,退出码也不稳定 - 插件更新常被忽略的点:很多插件(如
dealerdirect/phpcodesniffer-composer-installer)自己也有依赖,它们的过时不会体现在插件主包上,得单独查其require
为什么有些插件永远不显示在 outdated 结果里
不是 bug,是设计如此。Composer 对插件的版本约束处理更宽松——只要满足 composer-plugin-api 的版本要求,就认为“可用”,哪怕插件主包本身有新版本。
典型例子:phpstan/extension-installer 要求 "composer-plugin-api": "^2.0",而你装的是 v1.3.0,但 Composer 认为它“能工作”,就不会提示更新。
- 这类插件必须手动查 GitHub Release 或用
composer show phpstan/extension-installer看 latest version - 插件作者若没在
composer.json里写conflict或严格require,Composer 就不会主动预警 - 最稳妥的做法:把关键插件加入
composer.json的require,并用^或~锁定合理范围,再配合--direct监控
show -l 和 outdated --direct 的交叉结果,机器才不容易漏。

















