
Wire 报 no provider found for 错误怎么排查缺失的 Provider【免费下载链接】wireCompile-time Dependency Injection for Go项目地址: https://gitcode.com/GitHub_Trending/wi/wire在 Go 项目中运行wire代码生成工具时如果命令没有生成wire_gen.go而是输出一行以no provider found for开头的错误说明传给wire.Build的 provider 集合无法满足依赖图中的某个类型代码生成就此失败。本文围绕这个错误本身展开如何读懂错误信息、按错误定位到缺失的 provider、补上它并验证生成恢复。前提是项目已经按 README.md 安装好命令行工具go install github.com/google/wire/cmd/wirelatest并确认$GOPATH/bin已加入$PATH。另外说明一点README 同时标注 Wire 自 v0.3.0 起被视为 beta 且功能完整、项目已停止维护这不影响在既有项目里排查这个错误。在包目录运行 wire复现错误User Guide 要求在有 injector 的包目录里直接运行wire如果之前已经生成过wire_gen.go也可以用go generate重新生成生成文件头部自带//go:generate指令。报错时命令不会写文件而是把问题打印到终端这是排查的起点。读懂 no provider found for 错误信息tutorial 给出了一类最典型的错误。假设 injector 里漏写了Greeter的 providerfunc InitializeEvent(phrase string) (Event, error) { wire.Build(NewEvent, NewMessage) // woops! We forgot to add a provider for Greeter return Event{}, nil }运行wire后的输出文档示例# wrapping the error across lines for readability $GOPATH/src/github.com/google/wire/_tutorial/wire.go:24:1: inject InitializeEvent: no provider found for github.com/google/wire/_tutorial.Greeter (required by provider of github.com/google/wire/_tutorial.Event) wire: generate failed从这条错误里可以提取四段信息出错位置开头的wire.go:24:1指向 injector 内wire.Build调用所在的文件和行号injector 名inject InitializeEvent指明是哪个 injector 的 provider 集合有问题缺失类型的完整路径github.com/google/wire/_tutorial.Greeter是包的完整导入路径加类型名而不是短名。同名的类型分属不同包时靠这个路径区分不要按短名去搜索代码谁依赖它required by provider of ...Event告诉你需要这个类型的下游是谁。教程还解释了这条错误的使用方法它给出了缺失类型Greeter、出错行号和 injector 名以及需要这个类型的 provider这里是Event的 provider补上对应 provider 即可。测试数据里还能看到另外两种同族写法。internal/wire/testdata/MultipleMissingInputs/foo/wire.go中的三个 injector 分别触发no provider found for example.com/foo.Foo, output of injector缺失的类型就是 injector 自身要返回的类型即没有任何 provider 能产出输出类型一条no provider found for ...后面跟着多行needed by 类型 in provider 函数名 (文件:行号)同一个缺失类型被依赖链上的多个 provider 需要错误会把链上每一跳都列出来。完整输出见 internal/wire/testdata/MultipleMissingInputs/want/wire_errs.txt。记住一个关系no provider found for后面跟着的类型才是真正缺失的那个后面的needed by行只是列出依赖它的下游不需要为每一行分别补 provider。按错误信息补上缺失的 Provider漏写进 wire.Build 的已有 provider这是最直接的情形。教程的修复就是把漏掉的 provider 加回参数列表func InitializeEvent(phrase string) (Event, error) { wire.Build(NewEvent, NewGreeter, NewMessage) return Event{}, nil }教程明确说把Greeter的 provider 传进去之后问题即解决。补 provider 时注意 User Guide 的一条约束provider 函数必须导出exported才能被其他包使用。如果缺失类型的 provider 定义在别的包里而函数名未导出它就不可用排查时先确认目标函数存在且已导出。缺失类型是 injector 的输出类型错误以, output of injector结尾时说明 injector 要返回的类型没有任何 provider 能产出。测试用例 internal/wire/testdata/MultipleMissingInputs/foo/wire.go 里injectMissingOutputType返回Foo却用了空的wire.Build()报的正是这种错。排查方向确认 injector 返回类型是否正确再确认 provider 集合里有没有能产出该类型的函数。依赖链中间断了一环错误列出多行needed by时以no provider found for行里的类型为准补 provider整条链就通了。以测试数据为例provideZip需要Foo、provideZap需要Zip、provideZop需要Zap实际缺失的是Foo错误把它和三级needed by一起列出。为Foo补上 provider 后三行错误一起消失。接口绑定缺少具体类型的 provider一个措辞相近、容易混淆的错误发生在使用了wire.Bind的场景。User Guide 在 Binding Interfaces 一节要求包含接口绑定的 set必须在同一个 set 里还有产出该具体类型的 provider。internal/wire/testdata/ProviderSetBindingMissingConcreteType/foo/foo.go 违反这条规则setB只有wire.Bind而没有对应 provider报出的错误文档示例wire.Bind of concrete type *example.com/foo.foo to interface example.com/foo.fooer, but setB does not include a provider for *example.com/foo.foo这条错误和no provider found for的措辞不同但修复方向一致让绑定所指的具体类型的 provider 出现在同一个 set 中。修复后如何验证在包目录重新运行wire或go generate。按 tutorial 的描述成功时不再报错结果写入wire_gen.go其中是被填充好的 injector 实现User Guide 也说明生成文件头部带// Code generated by Wire. DO NOT EDIT.标记。如果修复后改报unused provider ...说明wire.Build里存在没有任何依赖需要的 provider教程给出的处理是把它从调用中删掉例如$GOPATH/src/github.com/google/wire/_tutorial/wire.go:24:1: inject InitializeEvent: unused provider NewEventNumber wire: generate failed上面为文档示例输出。容易混淆的相邻错误排查时先确认自己面对的是no provider found for而不是下面两类循环依赖报错是cycle for example.com/foo.Bar:加一条-链接表示 provider 互相引用成环与缺 provider无关。见 internal/wire/testdata/Cycle/want/wire_errs.txt。同一类型多个 providerFAQ 说明 Wire 不允许传给wire.Build的 provider 传递闭包中出现同一类型的多个 provider。因此补 provider 时不要顺手把两个返回同类型的函数都加进去那会触发另一种错误。补上 provider、重新运行wire且wire_gen.go正常生成后wire.go与wire_gen.go都应提交进版本库后续改动 injector 时用go generate即可重新生成。【免费下载链接】wireCompile-time Dependency Injection for Go项目地址: https://gitcode.com/GitHub_Trending/wi/wire创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考