Go 正在尝试编写自定义规则

Go 正在尝试编写自定义规则,go,build,bazel,Go,Build,Bazel,我正在尝试为编写自定义规则。其思想是运行它从GraphQL模式生成Go代码 我的预期用途是: gqlgen( name=“gql gen foo”, schemas=[“schemas/schema.graphql”], 可见性=[“//可见性:公共”], ) “name”是规则的名称,我希望其他规则依赖该名称;“模式”是一组输入文件 到目前为止,我已经: 加载( “@io_bazel_rules_go//go:def.bzl”, _go_context=“go_context”, _go_r

我正在尝试为编写自定义规则。其思想是运行它从GraphQL模式生成Go代码

我的预期用途是:

gqlgen(
name=“gql gen foo”,
schemas=[“schemas/schema.graphql”],
可见性=[“//可见性:公共”],
)
“name”是规则的名称,我希望其他规则依赖该名称;“模式”是一组输入文件

到目前为止,我已经:

加载(
“@io_bazel_rules_go//go:def.bzl”,
_go_context=“go_context”,
_go_rule=“go_rule”,
)
def_gqlgen_impl(ctx):
go=\u go\u上下文(ctx)
args=[“运行github.com/99designs/gqlgen--config”]+[ctx.attr.config]
ctx.actions.run(
输入=ctx.attr.schemas,
输出=[ctx.actions.declare_文件(ctx.attr.name)],
参数=args,
progress_message=“从%s”%ctx.attr.config生成GraphQL模型和运行时,
可执行文件=go.go,
)
_gqlgen=_go_规则(
实现=_gqlgen_impl,
属性={
“config”:attr.string(
default=“gqlgen.yml”,
doc=“gqlgen文件名”,
),
“模式”:attr.label\u列表(
允许_文件=[“.graphql”],
doc=“架构文件位置”,
),
},
可执行文件=True,
)
def gqlgen(**kwargs):
tags=kwargs.get(“tags”,[])
如果“手动”不在标签中:
附加标签(“手动”)
kwargs[“标记”]=标记
_gqlgen(**kwargs)
我眼前的问题是Bazel抱怨模式不是
文件

expected type 'File' for 'inputs' element but got type 'Target' instead
指定输入文件的正确方法是什么

这是生成执行命令的规则的正确方法吗

最后,可以让输出文件不存在于文件系统中,而是作为其他规则可以依赖的标签吗?

而不是:

ctx.actions.run(
        inputs = ctx.attr.schemas,
使用:

这是生成执行命令的规则的正确方法吗

只要使用正确的输出名称创建文件(
outputs=[ctx.actions.declare_file(ctx.attr.name)]
),这看起来是正确的

generated_go_file=ctx.actions.declare_文件(ctx.attr.name+“.go”)
# ..
ctx.actions.run(
输出=[生成的文件],
args=[“run”、“…”、“--output”,生成的\u go\u file.short\u path],
# ..
)
最后,让输出文件不存在于文件系统中,而是作为其他规则可以依赖的标签,这样可以吗

需要创建输出文件,并且只要在中的规则实现结束时返回该文件,其他规则将能够依赖于文件标签(例如
//my/package:foo gqlgen.go

ctx.actions.run(
        inputs = ctx.files.schemas,