composer outdated 默认不检查 require-dev 中的包,仅扫描 require 区块中直接声明的依赖;必须显式加 --dev 才列出开发依赖的过时项,--direct 参数不影响 require-dev 的检查范围。

composer outdated 默认不检查 require-dev 中的包,必须显式加 --dev 才能列出开发依赖的过时项;只加 --direct 或什么都不加,依然看不到它们。
为什么 composer outdated 默认不显示 dev 包?
Composer 把 require-dev 视为“仅用于本地开发”的依赖,和运行时依赖隔离处理。默认行为只扫描 require 区块——这是设计使然,不是 bug,也不是遗漏。
-
composer outdated(无参数)= 仅require中直接声明的包 -
composer outdated --direct= 和上面完全一样,--direct不影响require-dev -
composer outdated --dev= 只看require-dev中的包,忽略require -
composer outdated --dev --all= 查所有已安装的 dev 相关包,包括间接依赖(比如 phpunit 带进来的sebastian/exporter)
--dev 和 --all 组合的实际效果
单独用 --dev 只显示 require-dev 里直接写的包;加 --all 后才会把它们的子依赖也拉出来——但注意:这些子依赖本身未必在 require-dev 里声明,只是被某个 dev 包带进来的。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 常见场景:你写了
"phpunit/phpunit": "^10.0"在require-dev,执行composer outdated --dev只会列phpunit/phpunit;加--all后,phpunit/php-code-coverage、sebastian/environment等也会出现 - 风险点:间接 dev 包可能被其他非 dev 包共享,升级它可能意外影响运行时逻辑(比如某工具类被生产代码悄悄引用)
- 安全提示:
composer audit --dev才能查 dev 包的安全漏洞,outdated --dev不负责这个
如何精准定位某个 dev 包是否过时?
别靠肉眼扫长列表,用 grep 或 jq 过滤更可靠。尤其当项目用了大量测试/构建工具时,输出容易淹没关键信息。
- 查特定包:
composer outdated --dev | grep "phpstan/phpstan" - 只看补丁更新(最安全):
composer outdated --dev --patch-only - JSON 格式 + jq 精准提取:
composer outdated --dev --format=json | jq -r '.packages[] | select(.latest_status == "patch") | "\(.name) \(.installed) → \(.latest)"' - 跳过不稳定版本(如 RC/beta):
composer outdated --dev --stability=stable,避免把phpunit/phpunit v11.0.0-RC1当成可升级项
真正容易被忽略的是:某些 dev 包(比如 dealerdirect/phpcodesniffer-composer-installer)自身是插件,它的更新不会触发子依赖刷新,outdated --dev 能看到它,但 update 后可能还需手动 composer dump-autoload 才生效。










