答案是先运行composer why-not vendor/package:version定位阻塞链——输出倒序显示依赖层级,最后一行是根require,往上每行“(required by...)”即封杀源头。

composer require vendor/package:version 报“Your requirements could not be resolved”
这不是你写错了版本号,而是 Composer 在尝试把新包塞进现有依赖树时,发现它和某个已装包的约束根本无法共存。常见于:想装 laravel/framework:^11.0,但项目里已有 spatie/laravel-backup 锁死在 Laravel 10 兼容版;或要装 guzzlehttp/guzzle:^7.5,而 aws/aws-sdk-php 已经要求 Guzzle 8+。
别急着删 vendor/ 或改 composer.json,先用这个命令定位卡点:
-
composer why-not vendor/package:version(例如composer why-not guzzlehttp/guzzle:^7.5)——输出是倒序链路,最后一行是你自己写的 require,往上每行末尾的(required by ...)就是封杀源头 - 如果输出为空,大概率是目标版本根本没发布,或冲突来自
require-dev(比如phpunit/phpunit拖住了sebastian/exporter) - 加
--dry-run -v看完整解析日志:composer require vendor/package:version --dry-run -v,能暴露 SAT 求解器卡在哪条路径上
升级主包后子依赖不更新,导致运行时报 ParseError
执行 composer update vendor/package 默认只更新那个包本身,不会动它的子依赖。结果就是:你升了 Laravel 11,但 symfony/console 还锁在 5.4,而 Laravel 11 需要 6.0+,一跑命令就报 Class "Symfony\Component\Console\Command\Command" not found。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
必须显式带上 --with-dependencies:
-
composer update laravel/framework --with-dependencies—— 只动 Laravel 和它直系 require 的包 - 降主版本(如从 Guzzle 8 切回 7.4.5)要两步走:先在
composer.json里写死"guzzlehttp/guzzle": "7.4.5",再跑composer update guzzlehttp/guzzle --with-dependencies - 错误写法:
composer update "guzzlehttp/guzzle:^7"—— 引号 +^会让 Composer 自己找“最新兼容版”,不是你要的 7.4.5
PHP 版本不匹配被当成“依赖冲突”
报错里出现 requires php ^8.1 but your PHP version (7.4.33) does not satisfy that requirement,这不是依赖冲突,是环境不匹配。Composer 用当前 shell 的 php -v 输出去校验 composer.json 里的 "php": "^8.1",不满足就硬拦。
- 检查三者是否一致:
php -v、which php、composer config platform.php - Linux/macOS 下明确调用目标 PHP:
/usr/bin/php8.1 composer install - Windows 下用完整路径:
"C:\php\php81\php.exe" composer install -
config.platform.php只影响依赖解析,不改变运行时行为;改了它必须跑composer update --lock,否则composer.lock还记着旧版本包
composer.lock 合并冲突后 install 失败
Git 合并 composer.json 时产生 composer.lock 冲突,不能手动编辑 lock 文件。它是派生数据,不是源数据。
- 用 Git 工具干净合并双方
require和require-dev块(注意去重、排序) - 删掉当前
composer.lock和vendor/(建议先备份cp composer.lock composer.lock.bak) - 运行
composer update重新生成 lock 文件;若想最小化变动,加--minimal-changes(Composer 2.2+) - 如果报
hash verification failed,说明 dist.sha256 不一致,必须三件套一起清:rm -rf vendor/ composer.lock,再composer update
require-dev 里的测试工具锁死了核心组件,或者某个私有包的 conflict 字段悄悄封杀了所有升级路径。










