composer install 不适合预检查,因它默认复原 composer.lock 状态,不重新求解依赖,php 版本或扩展不匹配时会延迟报错且信息模糊;预检应使用 composer update --dry-run(重求解但不写入)或 composer check-platform-reqs(专查 php/扩展硬门槛)。

直接运行 composer install 不会提前告诉你依赖是否能装上——它只在解析失败时抛错,且错误藏得深。真要预检,得用 composer update --dry-run 或 composer check-platform-reqs,而不是靠 install 本身。
为什么 composer install 不适合做预检查
它默认读取 composer.lock 并尝试复现已知状态,不重新求解依赖图;即使 lock 文件里锁的是一个根本装不了的组合(比如 PHP 版本不匹配),install 也会走到最后才报错,而且错误信息指向“无法写入 vendor”,而非真实原因。
常见误判场景:
- 看到
Could not write to vendor/就去 chmod,其实问题出在php ^8.2被laravel/framework 11.0要求,而你本地是php 8.1.10 - 执行
composer install -v后盯着末尾的Conclusion: don't install X,却忽略上面几百行中真正触发冲突的那句myapp requires php ^8.2
composer update --dry-run 是最贴近“预安装”的操作
它强制重跑依赖求解器,但不写任何文件,也不改 composer.lock,纯粹验证当前 composer.json + 当前平台环境能否收敛出可行解。
实操要点:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 必须确保
composer.json是你最终想达成的状态(比如刚加了新包、改了版本约束) - 加
-v才能看到完整冲突链:composer update --dry-run -v - 如果输出里出现
Dependency resolution completed,说明可装;只要卡在Resolving dependencies through SAT阶段并报 conflict,就代表不可行 - 注意:它仍会受
platform配置干扰——比如你在composer.json里写了"platform": {"php": "8.2.0"},但实际 PHP 是 8.1,--dry-run会假装你是 8.2,导致误判
composer check-platform-reqs 专查 PHP/扩展硬门槛
这个命令不碰依赖图,只比对 composer.json 中 require 和 config.platform 声明的 PHP 版本、扩展(如 ext-mbstring)、INI 设置(如 memory_limit)是否满足当前运行环境。
它解决的是最底层的“能不能跑起来”问题:
- 输出为空 = 当前环境满足所有平台要求
- 输出类似
ext-gd missing (required by myapp/myproject)= 缺扩展,得装或启用 - 输出类似
php 8.1.10 = PHP 版本不够,不能硬扛 - 它不检查包之间兼容性,比如
monolog/monolog ^3.0和symfony/console ^5.4是否共存——那是update --dry-run的事
真正要查“某个包某版本为啥装不上”,别只用 why-not
composer why-not vendor/package:version 只回答“谁在拦这个版本”,但不回答“谁把拦路者引进来的”。比如它告诉你 monolog/monolog 3.5.0 requires guzzlehttp/guzzle ^7.5,但没说 monolog 是被哪个顶层包拉进来的。
必须连用:
- 先跑
composer why-not guzzlehttp/guzzle:7.9.0定位冲突源头包 - 再跑
composer depends -r monolog/monolog查谁依赖了monolog - 如果
depends -r输出空,说明该包已被conflict规则排除,或仅存在于require-dev且当前未启用--with-dependencies
依赖图不是线性的,嵌套层级越深,靠单条命令定位越容易漏掉中间传递者——这点很多人在 CI 流水线里踩过坑,直到加了 --no-cache 和 -v 才看清全貌。










