provide字段必须位于composer.json根级,用于声明本包实现的虚拟包(如"psr/cache-implementation": "*"),不触发安装;仅当其他项目require该虚拟包且满足约束时,composer才选择本包,但需确保接口实现、psr-4自动加载和类路径三者严格对齐。

你得在 composer.json 里写 provide,且必须是根级字段,不是 require 或 autoload 里的东西。
provide 字段必须放在 composer.json 顶层
很多人把 provide 塞进 require 或 scripts 里,结果完全不生效。它只认顶级键:
{
"name": "myorg/my-cache-driver",
"type": "library",
"provide": {
"psr/cache-implementation": "*"
},
"require": {
"php": "^8.0"
}
}
-
provide是声明“我实现了谁”,不是“我要装谁”——它不触发下载,也不影响自身依赖解析 - 值写
"*"表示兼容所有版本;若只支持 PSR-6 v3,可写"^3.0",但多数实现用"*"更稳妥 - 这个字段对当前包的根项目(即你正在开发的这个包)无效;只有别人
require你时,才起作用
为什么 require psr/cache-implementation 能装上你的包
框架或工具(如 Laravel、Symfony Cache Component)通常这样写依赖:
"require": {
"psr/cache-implementation": "^1.0"
}
Composer 看到这个虚拟包名,会去所有已注册包里查谁在 provide 里声明了它。你的包只要满足:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 已发布到 Packagist 或配置了私有源
-
composer.json里有正确的provide条目 - PHP 版本、扩展等约束能被满足
就会被选中安装——Composer 不校验你是否真实现了接口,只信你写的声明。
常见错误:装上了但运行时报 Class not found
声明了 psr/cache-implementation ≠ 自动加载就通。你还得确保:
- 你的类文件路径和命名空间匹配 PSR-4 规则,比如
PsrCacheCacheInterface对应src/CacheInterface.php -
composer.json的autoload段正确映射了命名空间:"psr-4": {"MyOrg\Cache\": "src/"} - 没漏掉
composer dump-autoload -o,尤其改过 autoload 配置后 - 别手动
include接口文件——这会绕过自动加载,且破坏命名空间一致性
别混淆 psr/cache 和 psr/cache-implementation
这是最容易卡住的地方:
-
psr/cache是接口定义包(含CacheInterface),要composer require psr/cache:^3.0 -
psr/cache-implementation是虚拟包名,不能直接require,只能靠别人声明 + 你提供 - 你自己的包既不是
psr/cache,也不该require它来“实现自己”;你只需实现接口,并在provide里告诉世界“我能当缓存实现用”
真正难的不是写 provide,而是让类结构、自动加载、接口实现三者对齐——少一个,框架就找不到你的驱动。










