我正在尝试为gqlgen编写自定义规则。这个想法是运行它来从 GraphQL 模式生成 Go 代码。我的预期用途是:gqlgen(
name = "gql-gen-foo",
schemas = ["schemas/schema.graphql"],
visibility = ["//visibility:public"],
)“name”是规则的名称,我希望其他规则依赖于此;“模式”是输入文件的集合。到目前为止我有:load( "@io_bazel_rules_go//go:def.bzl", _go_context = "go_context", _go_rule = "go_rule",)def _gqlgen_impl(ctx): go = _go_context(ctx) args = ["run github.com/99designs/gqlgen --config"] + [ctx.attr.config] ctx.actions.run( inputs = ctx.attr.schemas, outputs = [ctx.actions.declare_file(ctx.attr.name)], arguments = args, progress_message = "Generating GraphQL models and runtime from %s" % ctx.attr.config, executable = go.go, )_gqlgen = _go_rule( implementation = _gqlgen_impl, attrs = { "config": attr.string( default = "gqlgen.yml", doc = "The gqlgen filename", ), "schemas": attr.label_list( allow_files = [".graphql"], doc = "The schema file location", ), }, executable = True,)def gqlgen(**kwargs): tags = kwargs.get("tags", []) if "manual" not in tags: tags.append("manual") kwargs["tags"] = tags _gqlgen(**kwargs)我眼前的问题是 Bazel 抱怨这些模式不是Files:expected type 'File' for 'inputs' element but got type 'Target' instead指定输入文件的正确方法是什么?这是生成执行命令的规则的正确方法吗?最后,是否可以让输出文件不存在于文件系统中,而是作为其他规则可以依赖的标签?
1 回答
智慧大石
TA贡献1946条经验 获得超3个赞
代替:
ctx.actions.run( inputs = ctx.attr.schemas,
使用:
ctx.actions.run( inputs = ctx.files.schemas,
这是生成执行命令的规则的正确方法吗?
只要gqlgen
创建具有正确输出名称 ( ) 的文件,这看起来是正确的outputs = [ctx.actions.declare_file(ctx.attr.name)]
。
generated_go_file = ctx.actions.declare_file(ctx.attr.name + ".go")
# ..
ctx.actions.run(
outputs = [generated_go_file],
args = ["run", "...", "--output", generated_go_file.short_path],
# ..
)
最后,是否可以让输出文件不存在于文件系统中,而是作为其他规则可以依赖的标签?
需要创建输出文件,并且只要它在提供程序中的规则实现结束时返回DefaultInfo,其他规则将能够依赖于文件标签(例如//my/package:foo-gqlgen.go)。
- 1 回答
- 0 关注
- 111 浏览
添加回答
举报
0/150
提交
取消