provide字段仅对被他人require的包生效,必须置于其composer.json根级,键为packagist注册的虚拟包名(如psr/log-implementation),值推荐"*",写在根项目中无效且被忽略。

你不需要在自己的项目根目录 composer.json 里写 provide——它只对「被别人 require 的包」生效,写在根项目里完全被忽略。
provide 字段必须写在被发布的包的 composer.json 根级
provide 是包作者用的声明机制,不是你在本地项目里“告诉 Composer 我有啥”的配置项。它的作用是在依赖解析阶段,让 Composer 知道:“这个包(比如 myorg/logger-adapter)能当 psr/log-implementation 用”。
- ✅ 正确位置:和
name、require、autoload并列,是composer.json最外层的键 - ❌ 错误位置:
"require": { "provide": { ... } }或塞进autoload里 —— Composer 直接无视 - ⚠️ 根项目(即你执行
composer install的那个项目)的composer.json中写provide没有任何效果 - ? 只有当你把包发布到 Packagist,并被其他项目
require时,它的provide才参与依赖解析
键名必须是 Packagist 上注册的虚拟包名,拼错就等于没写
常见翻车点是手抖写错名字,比如把 psr/log-implementation 写成 psr/log 或 psr/log-interface。Composer 不校验、不报错,但下游 require "psr/log-implementation" 时会提示 “required but not provided”。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- ✅ 正确写法:
"psr/log-implementation"、"php-http/client-implementation"、"ext-gd" - ❌ 错误写法:
"psr/log"(这是真实包,不是虚拟包)、"psr/logimpl"(不存在)、"PSR/Log-Implementation"(大小写敏感) - ? 查证方式:打开 https://www.php.cn/link/bd6dd73b5ea38bdbc9b64a9639a85e66,确认名字是否在官方列表中
- ? 虚拟包名不带版本号,也不支持通配符 —— 必须精确匹配字符串
值推荐用 "*",但别乱写分支名或非法版本约束
provide 的值不是你自己的版本号,而是你所声明实现的那个虚拟包的兼容范围。它参与语义化版本匹配,写错会导致依赖方 fallback 失败。
- ✅ 推荐写法:
"*"(表示“完全兼容该规范任意版本”)、"^1.0 || ^2.0"(明确支持范围) - ❌ 禁止写法:
"dev-main"、"latest"、"3.x"、"self.version"—— Composer 解析失败并报错Invalid version string - ⚠️ 如果你的实现只兼容
psr/logv3,就别写"*",否则下游依赖 v1 的包可能运行时报错 - ? 修改后必须运行
composer update --lock,否则composer.lock仍按旧声明解析
provide 不解决 autoload,也不保证运行时类存在
provide 只影响依赖安装逻辑,和自动加载完全无关。它不检查你有没有实现 Psr\Log\LoggerInterface,也不验证类路径是否注册。
- ✅ 你必须自己配好
autoload,确保接口类和实现类都能被use和实例化 - ❌ 常见错误:写了
"provide": {"psr/log-implementation": "*"},但src/下根本没实现类,或autoload没映射到对应命名空间 - ? 验证方式:
composer show --platform能看到psr/log-implementation已满足,但一调用就Class not found - ? 这就是最隐蔽的坑:安装成功、声明有效、运行崩掉 —— 因为
provide只管“嘴上说有”,不管“手上真有”










