尝试编写自定义规则

我正在尝试为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

指定输入文件的正确方法是什么?


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


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


胡说叔叔
浏览 112回答 1
1回答

智慧大石

代替: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)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go