跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

Composer provide字段怎么用_Composer provide虚拟包教程【入门】

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
是“我和谁不能共存”。三者常组合使用: Composer 2.9.6 Composer 2.9.6 是 PHP 生态中高效、稳定的依赖管理工具。此版本在性能与兼容性上进一步优化,改进了依赖解析算法,提升大型项目中的安装与更新速度。它支持并行下载任务,显著减少等待时间,并增强了与私有仓库及镜像源的交互稳定性。同时修复了多项命令行交互与内存使用相关的缺陷,确保在复杂依赖关系下依然可靠运行。无论是新项目初始化还是现有系统维护,Composer 2.9.6 都能为开发者提供流畅、精准的依赖管理体验。 下载 想提供 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
。

相关文章