composer install报“Your requirements could not be resolved”却查不到冲突,根本原因是vendor/与composer.lock不一致导致校验失真;composer validate仅验JSON和哈希,不验vendor真实性;真正有效校验需依次执行composer install --dry-run -v、composer dump-autoload -o --no-dev、php -r "require 'vendor/autoload.php';"。

composer.lock 文件必须与 vendor/ 实际内容一致,否则所有依赖校验都失效。
为什么 composer install 会报错却查不到冲突源头
常见现象是运行 composer install 报 Your requirements could not be resolved...,但 composer show --tree 看起来没问题。根本原因在于:Composer 并不比对 vendor/ 和 composer.lock 是否匹配,它只检查 lock 文件语法、哈希、以及是否满足 composer.json 的约束。如果 vendor/ 被手动删改、或 composer.lock 被 git checkout 错版本、或有人执行过 --ignore-platform-reqs 后没重装,就会导致锁文件“声称装了 A”,而 vendor/ 里实际是 B 或缺失 —— 此时校验已失真。
校验前必须先确保:
- composer.lock 存在且非空
- vendor/ 目录存在(哪怕为空)
- 没有残留的 composer.phar 或旧版 Composer 缓存干扰(可先跑 composer clear-cache)
composer validate 只校验 JSON 结构,不校验依赖真实性
composer validate 是最常被误用的命令:它只检查 composer.json 和 composer.lock 的 JSON 语法、字段合法性、以及 lock 文件中每个包的 SHA256 哈希是否与 Packagist 归档一致 —— 它完全不验证 vendor/ 里到底有没有那个包、版本对不对、autoload 映射是否生效。
这意味着:
- 即使 composer validate 返回 OK,vendor/autoload.php 仍可能报 Class not found
- 如果你用私有镜像源但没同步哈希,validate 可能通过,但 install 会卡在下载阶段
- validate 不检查 PHP 版本兼容性,也不读 ext-xxx 扩展要求
真正有效的校验动作只有三个
要确认依赖数据真实可信,必须组合执行以下三步(顺序不能乱):
-
composer install --dry-run -v:不写文件,但完整走一遍依赖解析 + 平台检查 + 下载模拟。重点看末尾是否出现because链,以及是否有ext-mbstring is missing类提示 -
composer dump-autoload -o --no-dev:强制重建自动加载映射。如果失败,说明vendor/中某些包结构异常或命名空间注册错误(比如 PSR-4 路径拼错) -
php -d display_errors=1 -d error_reporting=-1 -r "require 'vendor/autoload.php'; echo 'OK\n';":绕过框架,直连 autoloader。输出OK才代表基础加载链通;报Call to undefined function往往意味着某个 polyfill 包没装对或版本错位
CI/CD 中容易忽略的校验盲点
很多流水线只跑 composer install 就认为依赖就绪,但以下情况它不会主动暴露:
- composer.lock 里记录的是 guzzlehttp/guzzle:7.8.1,但因网络中断,vendor/guzzlehttp/guzzle 实际只解压了一半 → install 成功返回,后续运行时报 Class 'GuzzleHttp\Client' not found
- require-dev 中的 phpunit/phpunit 在 lock 文件里是 9.6.13,但 CI 使用的 PHP 版本不满足其 php: ^8.1 要求 → install 默认跳过 dev 包,不报错,但后续 phpunit 命令直接找不到
- 项目启用了 "autoload": {"files": ["src/helpers.php"]},但该文件被 git 忽略或权限设为只读 → dump-autoload 不报错,但函数无法加载
所以 CI 中应固定加入:composer install --no-interaction --prefer-dist && composer dump-autoload -o && php -r "require 'vendor/autoload.php';"


















