Composer update 升不了 Laravel 主版本,因其严格遵循 composer.json 中的版本约束;若写 "^10.0" 则不会升至 "^11.0",必须手动修改版本号并执行 composer update laravel/framework --with-all-dependencies,同时确保 PHP ≥ 8.2、Composer ≥ 2.5,并逐主版本升级(如 9→10→11),不可跳步。

直接改 composer.json 版本号再跑 composer update,大概率会失败或引发运行时错误——框架升级不是版本号替换,而是依赖图重校准过程。
为什么 composer update 升不了主框架?
它严格遵守 composer.json 中的版本约束。比如写的是 "symfony/framework-bundle": "^5.4",就算 6.0 已发布,composer update 也绝不会装;而如果写的是 "^4.4",它最多升到 4.4.x 的最新补丁版,跨不到 5.x。
- 常见错误现象:
composer outdated显示laravel/framework 9.52 → 10.38,但composer update laravel/framework直接报错退出 - 根本原因:其他已锁包(如
spatie/laravel-permission)的require里还写着"laravel/framework": "^9.0",Composer 拒绝破坏兼容性 - 验证方式:运行
composer why-not laravel/framework:10.*,它会列出所有拦路的包及其约束 - 不要删
composer.lock强行重算——这会跳过所有兼容性检查,问题更隐蔽
升主框架必须分四步走,不能跳步
以 Symfony 4.4 → 5.4 或 Laravel 9 → 10 为例,官方迁移路径是线性的,中间版本不可省略。跳步会导致弃用项漏处理、事件签名错位、配置解析失败等静默问题。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 第一步:只更新框架核心包,例如
composer update symfony/framework-bundle symfony/http-kernel --with-dependencies - 第二步:更新官方生态 Bundle,如
symfony/orm-pack、symfony/mailer(注意swiftmailer-bundle在 5.0+ 已废弃) - 第三步:逐个确认第三方包是否适配,查其 GitHub Releases 页面和
composer.json中的require字段 - 第四步:扫清自定义代码,重点运行
php bin/console debug:deprecations和vendor/bin/rector process src/ --set symfony50
插件更新要防“子依赖断层”
执行 composer update vendor/package 默认只更新该包本身,它的子依赖(如 package 依赖的 symfony/event-dispatcher)仍按旧锁文件安装,极易出现“API 存在但实现已变”的兼容性断裂。
- 安全做法:加
--with-dependencies,让 Composer 一并重解该包声明的直接依赖 - 激进做法:加
--with-all-dependencies,递归更新整条依赖链(适合修高危漏洞,但需完整回归测试) - 典型陷阱:升级
guzzlehttp/guzzle到 7.x 后,php-http/guzzle6-adapter因仍引用GuzzleHttp\Clientv6 接口而崩溃 - 排查命令:
composer show guzzlehttp/guzzle看实际加载版本,composer depends guzzlehttp/guzzle查谁在引用它
全局包更新最容易踩权限与沙箱坑
全局安装的工具(如 laravel/installer、phpcs)升级后命令失效,90% 是因为 Composer 2.x 插件沙箱机制拒绝加载未声明 API 版本的插件,或 ~/.composer/vendor 权限错乱。
- 先运行
composer global show确认当前状态,再用composer global update --dry-run预览变更 - 避免
composer global update一次性全量升级——hirak/prestissimo在 v2 下已静默失效,但不会报错,只会卡在 “Package operations: 0 installs…” - 升级后务必测试命令,如
laravel --version;若失败,优先执行composer global dump-autoload,而非删vendor - 注意:
composer self-update在 2.5.0+ 已被移除,再执行会报Command "self-update" is not defined,应改用curl -sS https://getcomposer.org/installer | php覆盖安装
最常被忽略的一点:所有升级操作前,必须确保 composer.lock 已提交且无未暂存修改;否则 --dry-run 和 diff 结果都不可信,回滚也失去依据。

















