对等依赖是 npm 生态中 peerDependencies 的中文误译,Composer 官方无此概念;它指插件类包声明“宿主环境须提供某依赖(如 React 18)”,但自身不安装,而 PHP/Composer 仅用 require 声明依赖。

什么是“对等依赖”?Composer里没有这个术语
你搜到的“对等依赖”大概率是误译或混淆概念。Composer 官方文档和源码中从不使用 peer dependency 这个词——那是 npm 的概念,指插件类包声明“我期望宿主环境已提供某依赖(如 React 18),但我自己不安装它”。PHP 生态(包括 Composer)没有运行时宿主/插件契约模型,require 就是唯一依赖声明机制。
你想表达的可能是这三种情况之一
根据实际使用场景,你真正需要的配置方式通常是以下之一:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 你的包(比如一个 Laravel 扩展)**不直接 require 框架本身**,但要求宿主项目已装
laravel/framework:这时你应把框架加进require-dev用于本地开发测试,并在composer.json的extra或文档里明确说明“需配合 laravel/framework ^10.0 使用”,而不是试图“假装依赖不存在” - 你发布一个只提供自动加载规则、不带运行时逻辑的包(如纯类型定义、PSR 接口桥接),想避免强制拉取实现:这种包应设
"type": "library",并在require中只写最低限度的接口约束(如"psr/log": "^1.0 || ^2.0 || ^3.0"),而非留空 - 你在做插件系统,希望多个扩展共享同一份核心依赖(如都用同一个
symfony/event-dispatcher实例):Composer 本身不控制运行时单例,靠的是 autoloading + PSR-4 映射 + 容器注入。确保所有包都require兼容版本(如"^6.4 || ^7.0"),让 Composer 解析出共同满足的版本即可
强行“模拟 peer dep”会踩哪些坑
有人尝试用 conflict 或空 require 来绕过,结果往往更糟:
"conflict": {"laravel/framework": " 看似限制宿主版本,但一旦宿主没装 laravel,Composer 直接报错“无法解析依赖”,而不是静默跳过- 删掉
require字段、仅靠autoload声明命名空间,会导致composer install不检查任何依赖,CI 环境跑测试时直接Class not found - 用
replace声明“我替代某个包”:这会让 Composer 认为你提供了该包全部功能,实际却没实现,引发运行时崩溃
最稳妥的做法,始终是诚实声明你代码里 use 或 new 了哪些类——它们所属的包,就该出现在 require 或 require-dev 里。Composer 的依赖解析足够智能,能处理多层兼容性;遮掩只会把问题推迟到运行时。

















