provide字段用于包作者声明本包实现的虚拟包(如psr/log-implementation),须置于composer.json根级,键名为已注册虚拟包名、值推荐"*",错误位置或拼写不会报错但导致运行时class not found。

provide 字段只在你发布自己的包时才有意义,不是你在项目里写来“声明当前环境有啥”的工具。 它的作用是让 Composer 在解析依赖时,把你的包当成某个虚拟包(比如 psr/log-implementation)的可用实现——前提是你的包真能跑通对应接口。
provide 必须写在被安装包的 composer.json 顶层
它不是给根项目用的配置项,不能塞进 require、extra 或任何嵌套结构里。错误写法:"require": {"provide": {"psr/log-implementation": "*"} } —— 这完全无效。
- 正确位置:必须是
composer.json根对象的直接子字段,和name、require并列 - 键名必须是 Packagist 上已注册的虚拟包名,例如
psr/cache-implementation,拼错或自造名字不会被识别 - 值推荐用
"*",表示“本包完整实现了该规范”,避免因版本号不匹配导致依赖方 fallback 失败 - 如果你的包同时
require了psr/log,又provide了psr/log-implementation,没问题;但别反过来requirepsr/log-implementation—— 它不是真实包,无法安装
为什么 require psr/log-implementation 却装了 monolog/monolog
因为你没写 provide,而是别人写了。Composer 查到 monolog/monolog 的 composer.json 里有 "provide": {"psr/log-implementation": "*"},而你 require 的正是这个虚拟名,它就自动选中并安装 monolog。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 这个过程不依赖你本地有没有
psr/log-implementation这个“包”,它压根不存在 - Composer 只是把所有已知包的
provide声明收集起来,构建成一张“谁提供什么能力”的映射表 - 运行
composer show --platform可以看到当前环境中哪些虚拟包已被满足,以及由哪个真实包提供 - 如果你自己也写了个日志实现,但没声明
provide,那即使代码兼容 PSR-3,其他包也不会把它当作psr/log-implementation的候选
provide 写错不会报错,但会让运行时崩得莫名其妙
provide 不影响 autoloader,也不触发任何安装逻辑,所以 Composer 不会校验你是否真有对应类、路径是否注册、方法签名是否匹配。它只管“声称”。
- 典型翻车:包里写了
"provide": {"psr/cache-implementation": "*"},但没 autoloadPsr\Cache\CacheInterface的实现类,或者实现类根本不在autoload配置里 - 结果就是:依赖安装成功,
composer show --platform显示已满足,但一运行就Class not found - 另一个坑:填的版本号是你“声称实现的规范版本”,不是你自己包的版本。比如你实现的是 PSR-6 v2.0 接口,却写
"psr/cache-implementation": "1.0",下游包要求^2.0就可能不匹配 - 验证是否生效,最实在的办法是建个空项目,
require一个明确依赖该虚拟包的包(比如symfony/console),再加你的包,看会不会装上、会不会报no matching package found
真正容易被忽略的点是:provide 是包作者的事,不是使用者的配置开关;它生效的前提是你发布的包被别人 require,而不是你本地改完 composer.json 就能绕过依赖检查。写对了只是“有机会被选中”,写错了则大概率等到 Class not found 才发现漏了 autoload 或接口不全。










