composer outdated 可列出当前 composer.json 中声明的依赖里存在更高兼容版本的包,输出包名、当前版本、最新版本三列,带 ! 表示主版本升级需人工确认bc中断,标 [security] 的须优先处理;它不修改任何文件。

composer outdated 能看出哪些包该更新
它不改任何文件,只列出当前 composer.json 中声明的依赖里,有哪些存在更高兼容版本。输出分三列:包名、当前装的版本、可升到的最新版本。带 ! 标记的是主版本升级(比如 symfony/console 5.4.39 → 6.4.0),必须人工确认 BC break;标有 [security] 的要优先处理。
常见漏判情况:
-
outdated默认忽略require-dev下的包,加--dev才显示 - 如果某个包被
replace或provide掩盖了,它可能根本不出现 -
"minimum-stability": "stable"会过滤掉所有beta/rc版本,即使它们是官方推荐的“最新稳定候选”
composer update --with-all-dependencies 不等于“全升”,但最接近需求
这个参数会让 Composer 把所有已安装的包(包括间接依赖)都纳入版本重协商范围,前提是它们没脱离 composer.json 的约束。例如你写了 "laravel/framework": "^9.0",它不会升到 v10,但会把 symfony/console、monolog/monolog 等所有 Laravel 9 允许的子依赖,一口气拉到各自约束下的最高兼容版。
关键限制:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 不会碰 lock 文件里残留的“孤儿包”(比如某 dev 包卸载后还留在 vendor 里的)
- 如果两个路径对同一个包提出冲突要求(A 要
^3.0,B 要^4.0),Composer 仍会报错,不强制覆盖 - 不解决 PHP 版本或扩展缺失问题——
Your requirements could not be resolved很可能是因为本地 PHP 是 8.1,而新包要求 8.2+
跳过某些包、锁定某些版本的实际写法
日常维护中几乎不可能无差别全升。更现实的做法是控制范围:
- 只升运行时依赖,跳过开发工具:
composer update --no-dev - 明确排除一个包(比如暂不升级
laravel/framework):composer update --with-all-dependencies vendor/package1 vendor/package2,不把它的名字写进去 - 临时锁死某个包的版本:
composer update --with-all-dependencies --prefer-stable,避免拉dev-master或alpha - 想升但被冲突卡住?先用
composer why-not vendor/package:version查谁在阻止,再针对性放宽约束
升级后类找不到?大概率是 autoload 没刷新
90% 的“升级后报 Class not found”不是包没装对,而是自动加载映射没重建。执行:
composer dump-autoload -o
即可生成优化后的静态映射。如果项目用了自定义 PSR-4 命名空间,顺手检查下 composer.json 的 autoload 段是否被意外覆盖或缩进错乱——升级过程本身不会动它,但手动编辑时容易出错。
真正麻烦的是依赖图里存在隐式耦合:比如 A 包调用 B 包的某个私有方法,B 升级后删了它,A 却没改。这种问题 outdated 和 update 都检测不到,只能靠测试覆盖和 CHANGELOG 人工比对。










