尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何用 wire show 查看 Provider Set 的输入、输出与依赖的 Provider Set

如何用 wire show 查看 Provider Set 的输入、输出与依赖的 Provider Set 如何用 wire show 查看 Provider Set 的输入、输出与依赖的 Provider Set【免费下载链接】wireCompile-time Dependency Injection for Go项目地址: https://gitcode.com/GitHub_Trending/wi/wireWire 是 Go 的编译期依赖注入代码生成工具。当项目里的 provider 越来越多时在运行代码生成之前你往往需要先弄清一件事某个 provider set 自身能产出什么类型、它依赖哪些其他 provider set、还需要哪些外部输入。Wire 命令行工具的show子命令就是为此设计的给定一个或多个包它会找出所有以顶层变量声明的 provider set打印这些 set 导入依赖的其他 provider set以及在各可能的输入条件下能产出的输出类型同时列出包内定义的 injector 函数。本文按「安装工具 → 准备示例包 → 执行wire show→ 解读与核对输出」的路径走一遍。安装并准备 wire 命令按 README 的说明安装go install github.com/google/wire/cmd/wirelatest并确保$GOPATH/bin已加入$PATH之后wire命令即可在终端使用。README 顶部有一个明确的警告该项目已不再维护不再接受新功能仍接受 bug 报告与修复。如果你需要对show等命令做扩展只能在 fork 中进行。wire show本身是只读操作它加载并类型检查你指定的包把报告打印到标准输出不会生成或修改wire_gen.go。准备一个含顶层 Provider Set 的示例包show只报告「声明为顶层变量的 provider set」也就是wire.NewSet(...)赋给包级var的那些集合。下面按 User Guide 中的示例 provider 代码组一个最小可运行的包。先建一个 Go module导入路径沿用 User Guide 示例中的example.com/foobarbaz换成你自己的模块路径即可并在包根目录写一个文件例如foobarbaz.gopackage foobarbaz import ( context errors github.com/google/wire ) type Foo struct { X int } // ProvideFoo returns a Foo. func ProvideFoo() Foo { return Foo{X: 42} } type Bar struct { X int } // ProvideBar returns a Bar: a negative Foo. func ProvideBar(foo Foo) Bar { return Bar{X: -foo.X} } type Baz struct { X int } // ProvideBaz returns a value if Bar is not zero. func ProvideBaz(ctx context.Context, bar Bar) (Baz, error) { if bar.X 0 { return Baz{}, errors.New(cannot provide baz when bar is zero) } return Baz{X: bar.X}, nil } var SuperSet wire.NewSet(ProvideFoo, ProvideBar, ProvideBaz)对应地初始化模块并引入 wire 库依赖go mod init example.com/foobarbaz go get github.com/google/wire这个包里只有一个顶层 provider set 变量SuperSet。如果你还按 User Guide 的方式把多个 set 聚合成更大的 set例如var MegaSet wire.NewSet(SuperSet, pkg.OtherSet)show会把这种聚合关系作为依赖项打印出来。执行 wire show进入包的目录或 module 根目录执行wire show不传包参数时show默认处理当前目录.也可以在后面列出多个包路径一次处理多个包。如果部分 provider 代码由 build tag 控制用-tags参数向默认的 wirebuild 追加 build tagshow与gen、check一样提供该参数wire show -tags tag名把tag名替换为你代码中实际使用的 build tag。解读 show 的输出命令成功时退出码为 0标准输出按如下结构给出报告多个顶层 provider set 之间以空行分隔并按导入路径与变量名排序Set 名称行报告开头一行格式为加引号的导入路径 . 变量名。对应上面的示例这一行是按示例模块路径给出的示意example.com/foobarbaz.SuperSet依赖的 Provider Setimports名称行下方每个制表符缩进的行是该 set 传递性导入的其他顶层 provider set。你的 set 若是wire.NewSet(SuperSet, pkg.OtherSet)这类聚合这里会列出被引用的 set 及其继续导入的 set。按输入分组的输出show把该 set 能产出的类型按「需要哪些输入」分组每组以一行Outputs given 输入类型:开头不需要任何输入时输入部分写作no inputs。每组下列出每个可产出类型一行其后紧跟at 文件:行号标注该类型对应的 provider、value 或 field 在源码中的位置。对上例的SuperSetProvideFoo和ProvideBar的依赖都在 set 内部可满足ProvideBaz额外需要context.Context因此输出会分成两组no inputs组包含Foo和Bar另一组以context.Context为输入、包含Baz。Injectors 列表如果包内定义了 injector 函数函数体是wire.Build(...)调用报告末尾会有Injectors:一节逐个列出这些函数。仓库里的教程 _tutorial 直接用wire.Build而没有任何顶层 set 变量对它执行show时就只会看到 injector 列表这一部分——这也是核对报告覆盖范围的直观对照。核对报告与常见情况成功条件退出码为 0标准输出出现每个顶层 set 的名称行、依赖列表与 Outputs 分组。核对方法是把报告与源码对照报告中列出的顶层 set 应与你代码中wire.NewSet的包级变量一一对应某个Outputs given ...分组里出现的输入类型意味着 set 内部没有该类型的 provider该类型只能由外部如 injector 参数提供——看到意料之外的输入类型时就去检查消费它的 provider。报告为空如果命令成功却几乎没有输出检查该包是否真的有顶层wire.NewSet变量以及目录参数是否指向了正确的包。失败加载失败时标准错误会打印带wire:前缀的错误信息并以wire: error loading packages收尾退出码非 0此时先确认包路径存在且包本身可以编译通过。边界与限制show只覆盖顶层变量声明的 provider set。injector 的wire.Build参数虽然也构成一个 provider set但没有变量名不会作为独立 set 出现在报告中injector 本身只在Injectors:一节被列出。报告只描述类型层面的输入、输出与依赖要得到真正可运行的注入代码仍需在该包目录执行wire即 gen 子命令生成wire_gen.go之后可以用go generate再生成。被 build tag 排除的代码要出现在分析结果中需通过-tags把对应的 build tag 传给wirebuild默认标签。进阶语法binding、wire.Struct、wire.Value、cleanup 等见 User Guide完整上手流程见 Tutorialshow子命令的用法文本与实现位于 cmd/wire/main.go。【免费下载链接】wireCompile-time Dependency Injection for Go项目地址: https://gitcode.com/GitHub_Trending/wi/wire创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表