provide 是 composer.json 根级字段,用于声明本包可替代其他包;必须与 name、require 并列,不可置于 require 或 autoload 内;值须为合法版本约束(如 "^3.0"),修改后需运行 composer update --lock。

provide 不是安装包,而是告诉 Composer:“我这个包,能当另一个包来用”——配错位置、写错格式或误用场景,会导致依赖解析失败、包冲突或提示 “required but not provided”。
provide 字段必须写在 composer.json 根级,不能塞进 require 或 autoload
Composer 只认根级 provide 字段,放错地方就完全忽略。常见错误是把它当成 require 的兄弟字段,写在 require 对象里,或者误塞进 autoload 下面。
- ✅ 正确位置:和
name、require、autoload并列的顶层键 - ❌ 错误写法:
"require": { "psr/log": "^3.0", "provide": { "psr/log": "^3.0" } }—— 这个provide会被无视 - ⚠️ 修改后必须运行
composer update --lock,否则 lock 文件不更新,线上环境仍按旧依赖图解析
版本号只能用约束语法,不能写 dev-main 或 * 以外的通配符
provide 值不是 Git 分支名,也不是任意字符串,它参与版本兼容性判断,必须是 Composer 能解析的合法版本约束。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- ✅ 允许:
"psr/log": "^3.0"、"psr/log": "*"、"monolog/monolog": ">=2.0.0 - ❌ 禁止:
"psr/log": "dev-main"(报错:Invalid version string "dev-main")、"psr/log": "3.x"(非标准约束)、"psr/log": "latest"(无效) - ? 多个提供项直接平铺,不要嵌套数组:
"provide": { "psr/log": "^3.0", "psr/cache": "^3.0" }
provide 和 replace 的行为差异极大,别用 replace 替代 provide
两者语义完全不同:provide 是“我能顶替”,replace 是“我直接删掉你”。用错会破坏整个依赖树。
- ✅
provide允许共存:项目可同时 requirepsr/log和你的包;其他包也能正常 requirepsr/log - ❌
replace是排他性移除:一旦你的包replace了psr/log,别人再require psr/log就会静默跳过安装,哪怕其他依赖明确需要它 - ? 调试时用
composer show --tree查依赖展开,如果某包该出现却不出现,优先检查是否被replace误杀
provide 配置生效但没起作用?先确认你真需要它
很多场景下,开发者以为要写 provide,其实只是 autoload 或 require 没对齐,或者根本不需要虚拟包机制。
- ⚠️ 如果你只是封装了
monolog/monolog并做了适配,但没对外暴露相同接口(比如没实现Psr\Log\LoggerInterface),就别写provide—— 否则别人装了你的包,再装monolog/monolog反而报冲突 - ⚠️ 如果你同时
require和provide同一个包(如"require": {"psr/log": "^3.0"}, "provide": {"psr/log": "^3.0"}),Composer 虽不报错,但会掩盖真实依赖来源,增加维护成本 - ? 真正需要
provide的典型场景只有两个:① 实现 PSR 标准但不硬依赖参考实现(如自研日志器声明提供psr/log);② 兼容多个底层驱动(如数据库抽象层声明提供doctrine/dbal和laravel/database)

















