Composer 2.9.6 完全不解析、不安装、不校验 peer-dependencies,该字段仅作装饰性声明;报错中的 PHP 版本冲突源于 require 或 platform 配置,而非 peer-dependencies。

Composer 2.9.6 不解析也不安装 peer-dependencies
Composer 当前(2.9.6)根本不处理 peer-dependencies,既不校验、也不安装、更不写入 composer.lock。这个字段在 npm 里是核心机制,但在 Composer 生态中纯属“装饰性声明”——哪怕你项目里写了 "peer-dependencies": {"php": ">=8.2"},Composer 完全无视,连警告都不会抛。
报错里出现 “requires php ^8.1 but you have 8.0” 不是 peer 问题,是 require 或 platform 配置冲突
如果你看到类似错误,真正触发点只有两个:
-
require字段里明确写了"php": "^8.1",而本地 PHP 是 8.0 -
"config": {"platform": {"php": "8.0"}}被硬设,但某个包的require声明了"php": "^8.1"
peer-dependencies 在 Composer 中不会参与任何约束计算,它不会出现在 composer why-not php:8.2 的输出里,也不会被 composer show --tree 列出。
某些插件或工具会读取 peer-dependencies,但 Composer 本身不负责执行
比如 composer-normalize 或某些 IDE 插件可能解析该字段用于提示,但:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 它不影响
install或update流程 - 不会阻止安装,哪怕你缺失所有 peer 包
- 没有等效于 npm 的
--legacy-peer-deps开关
如果你依赖某包的 peer 行为(如 Laravel 的契约包),必须手动确保其 require 声明已满足,不能指望 Composer 自动补上。
想模拟 peer 行为?只能靠 conflict + require 组合硬控
真要实现类似约束,唯一可靠做法是:
- 用
"conflict"封杀不兼容组合,例如"conflict": {"laravel/framework": " - 用
"require"显式拉入必要运行时依赖,例如"require": {"illuminate/contracts": "^11.0"} - 避免把本该 runtime 的依赖塞进
peer-dependencies字段,否则等于放弃控制权
peer-dependencies 字段目前只是文档占位符,别把它当逻辑开关——所有实际约束,都得落在 require、conflict 和 config.platform 上。

















