provide 字段用于声明本包可替代其他包,如实现相同接口的轻量替代品;必须写在需被下游依赖识别为兼容替代时,格式为 "provide": { "vendor/name": "version" }。

provide 字段是干啥的,什么情况下必须写
provide 是 composer.json 中用于声明“本包能替代其他包”的字段,本质是告诉 Composer:“我虽然不是 monolog/monolog,但我实现了它的接口、能当它用”。常见于虚拟包(virtual package)或轻量实现(比如日志适配器、缓存驱动)。不写 provide,下游依赖 monolog/monolog 的包就无法安装你的替代实现——Composer 会报错:Root composer.json requires monolog/monolog, but none of the packages provide it.
provide 写法和 key-value 规则
格式固定为对象:"provide": { "vendor/name": "version" }。注意:
-
vendor/name必须是合法包名(如psr/log、monolog/monolog),不能带空格或特殊字符 -
version不是真实版本号,而是“兼容声明”:可写*(表示完全兼容)、^1.0(语义化兼容)、甚至self.version(引用本包当前版本) - 一个包可
provide多个包,但每个 key 必须唯一;重复声明同一名字会覆盖前一条 - 不能用
provide声明自己(即"provide": { "myorg/mylib": "*" }是无效且无意义的)
示例:
"provide": {
"psr/log": "^1.0 || ^2.0",
"monolog/monolog": "*"
}
provide 和 replace、conflict 的区别在哪
provide 是“我能当谁用”,纯声明,不触发卸载;replace 是“我就是谁”,Composer 安装时会跳过被替换的包;conflict 是“我和谁不能共存”。三者常组合使用:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 想提供 PSR-3 实现又不想让
psr/log被实际安装?只写provide+require自己的接口类即可 - 想彻底替代
monolog/monolog并阻止它被装进来?加"replace": { "monolog/monolog": "*" } - 担心旧版
monolog的 API 冲突?补上"conflict": { "monolog/monolog": "
错误做法:只写 replace 不写 provide ——下游依赖 psr/log 的包仍会失败,因为 replace 不传递“能力”,只影响安装决策。
本地测试 provide 是否生效的最快方法
别等 CI 或别人反馈,用 composer show --tree 直接验证:
- 先
composer require your-virtual-package:dev-main(确保已发布或 path repo 配置正确) - 再运行
composer show --tree | grep "psr/log",看到类似yourorg/psr-log-adapter 1.0.0 provides psr/log (^1.0 || ^2.0)就说明生效 - 如果报
your-virtual-package is not a valid virtual package,大概率是type字段没设成virtual-package(虽非强制,但强烈建议设)
真正容易被忽略的是 autoload 配置:即使 provide 写对了,若没通过 autoload 暴露对应接口类(如 Psr\Log\LoggerInterface),运行时仍会 Class not found。










