composer install 不解析依赖,只按 composer.lock 精确还原:它跳过版本约束计算,直接依据锁定的版本、哈希、路径安装包,确保环境一致;若 lock 缺失则退化为 update,导致 ci 失败或 class not found。

composer install 不解析依赖,只还原 lock 文件
它根本不重新计算版本交集或检查约束兼容性——composer install 的唯一任务是:按 composer.lock 里记录的精确版本、哈希和路径,把包原样放进 vendor/。所谓“不同层级”在 install 阶段不存在,只有已锁定的扁平化安装清单。
常见错误现象:
- 本地装得通,CI 报
Class not found→composer.lock没提交,CI 实际执行的是 fallback 到update行为 - 运行
composer install却提示 “Your requirements could not be resolved” → 不是依赖冲突,而是 PHP 版本、扩展缺失或config.platform配置与真实环境不符
关键判断点:
- 检查
ls vendor/是否非空;空则说明根本没装过,不是 install 失败,是还没走到 install 那步 - 确认
composer.lock存在且 Git 已跟踪;漏掉它等于放弃版本控制 -
composer diagnose会直接标出缺失的 ext-mbstring、ext-xml 等,比看报错更准
为什么你看到的“层级”其实是 install 后的结果,不是 install 的过程
composer show --tree 显示的缩进结构,来自已安装包的 vendor/composer/installed.json 和各包 composer.json 中的 require 字段,和 composer install 执行时无关。install 只管放文件,不建树。
容易踩的坑:
- 以为
guzzlehttp/guzzle在缩进第 5 层就“不重要”,其实它可能被laravel/framework和symfony/http-client同时直接 require,改版本会同时触发两套约束 - 用
composer show -t查树却输出为空 → 先跑composer install,否则vendor/为空,树就是空的 - 终端宽度太小导致缩进错位,误判层级 → 加
| less -S横向滚动查看
真正决定“哪些包装在哪一层”的,是 composer.lock 生成那一刻的解析结果
那个时刻由 composer update 或首次 composer install(无 lock 时)触发,背后是 SAT 求解器对所有 require、conflict、php 版本等约束的数学证明。一旦 UNSAT,就彻底无解,不是“再试一次”能绕过的。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
典型冲突场景:
-
laravel/framework:^10.0要求guzzlehttp/guzzle:^8.0,而你显式 requireguzzlehttp/guzzle:^7.0→ 交集为空 - 某包声明
"conflict": {"ext-zip": "*"},但你的config.platform.ext-zip设为"1.19"→ 所有该包版本被直接排除 -
package-arequirefoo/bar:^2.0,package-brequirefoo/bar:^3.0→ 无重叠可选版本
定位这类问题,唯一可靠命令是 composer why-not guzzlehttp/guzzle:7.0,它不依赖当前 lock,直接模拟求解并返回阻断路径。
生产部署时,install 的行为必须严格受控
CI/CD 脚本里只允许一条标准写法:composer install --no-dev --optimize-autoloader。加其他参数基本等于放弃确定性。
为什么不能加 --ignore-platform-reqs:
- 它绕过 PHP 版本、扩展检查,装出来的包大概率运行时报
Call to undefined function mb_strlen()这类错误 - 这不是“临时 workaround”,是掩盖环境缺陷,后续排查成本远高于提前修复
最常被忽略的一点:composer install 成功 ≠ 应用能跑起来。autoload 没生效、PSR-4 映射错位、vendor/autoload.php 没被引入——这些和 install 本身无关,但用户第一反应总以为是依赖没装好。










