composer outdated --direct --minor-only --format=json 是日常巡检唯一可靠组合,它聚焦直接依赖的小版本更新,输出结构化 JSON 便于 CI 自动解析与告警。

composer outdated --direct --minor-only --format=json 是日常巡检唯一可靠组合
直接跑 composer outdated 不能进 CI,它默认不返回有意义的退出码,输出格式也不稳定,CI 解析容易崩。真正能自动化的只有加参数后的结构化输出。
-
--direct:只查composer.json里你亲手写的require包,避免传递依赖刷屏干扰判断 -
--minor-only:过滤掉主版本跃迁(如 7→8)和补丁更新(如 7.4.1→7.4.2),专注安全又低风险的小版本升级 -
--format=json:输出标准 JSON,字段含latest-status(值为major/minor/patch),可直接用jq判断 - 必须加
2>/dev/null屏蔽网络超时、插件警告等非关键日志,否则脚本可能误判失败
典型监控命令:composer outdated --direct --minor-only --format=json 2>/dev/null | jq 'if .packages | length == 0 then exit(0) else exit(1) end'
有小版本更新就退 1,触发告警;无则退 0,静默通过。
composer audit --dev --severity=high,critical 才算真查漏洞
composer audit 命令在 Composer 2.5+ 才存在,老版本会报 Command "audit" is not defined。它不扫描源码,只比对 composer.lock 和 Packagist 安全通告库——但默认跳过开发依赖,等于把 phpunit、mockery 这类高危测试工具全放行。
- 必须显式加
--dev,否则require-dev里的包一个不扫 -
--severity=high,critical可过滤低危噪音,聚焦真实阻断项 -
--no-interaction是 CI 必选项,否则卡在交互提示上 - 注意:私有包、
path类型本地依赖、fork 包默认被静默跳过,不会报错也不会告警
别信终端颜色渲染的 No advisories found —— 真实漏洞数藏在 JSON 输出的 advisories_count 字段里,得用 --format=json 解析。
composer validate --strict 和 platform 兼容性检查必须并行跑
composer audit 只管 CVE,不管 PHP 版本兼容性。比如项目锁死 "php": "8.2",但某个依赖最新版只支持 8.3+,audit 完全不提醒,部署时直接 Fatal error。
-
composer validate --strict会校验composer.json中platform配置是否与当前环境匹配,也检查repositories格式、autoload规则等 - 它不联网、不扫描 vendor,纯静态检查,快且稳定
- 必须和
audit同时跑,漏掉任一环节都可能让漏洞或崩溃漏进生产
常见错误是只跑 audit 就以为万事大吉,结果上线后因平台不兼容整个服务起不来。
定时任务不能只靠 Composer,得自己搭调度闭环
Composer 没有「每日巡检」开关,composer outdated 和 audit 都是单次命令。想真做到自动化,必须外接调度器 + 结果处理 + 告警通路。
- GitHub Actions 最轻量:用
cron触发,执行上述两个命令,把 JSON 输出存为 artifact 或发 Slack - 关键不是“有没有漏洞”,而是“有没有新出现的漏洞”——建议对比历史快照,只告警增量项
- 别用
composer update --dry-run替代outdated监控:它解析整张依赖图,慢、内存占用高、退出码不可靠 - 如果项目用了镜像源(如阿里云),确认它同步了 Packagist 的安全元数据,否则
audit结果不准
最常被忽略的是私有包和 fork 包——它们不会出现在任何 outdated 或 audit 输出里,得靠人工维护 security-advisories 元数据或单独走内部漏洞库比对。











