我正在尝试为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
指定输入文件的正确方法是什么?
这是生成执行命令的规则的正确方法吗?
最后,是否可以让输出文件不存在于文件系统中,而是作为其他规则可以依赖的标签?
智慧大石
相关分类