为了账号安全,请及时绑定邮箱和手机立即绑定

尝试编写自定义规则

尝试编写自定义规则

Go
胡说叔叔 2023-07-10 17:43:32
我正在尝试为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)。


查看完整回答
反对 回复 2023-07-10
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信