如何将自定义规则的输出放在`bazel-genfiles /`而不是`bazel-out /`?

use*_*169 4 bazel

我们正在生成许多Go源文件作为构建的一部分.以前我们使用了genrule(这里的例子)导致生成的文件存储在其中bazel-genfiles/.

我们最近切换到使用自定义规则,如rules_go(https://github.com/bazelbuild/rules_go/tree/master/examples/bindata)所示.此更改意味着输出源文件存储bazel-bin/而不是bazel-genfiles/.

输出位置的这种变化破坏了我们开发人员使用的一些IDE中的Go集成.值得注意的是,在(Bazel)查找模式下运行时,VSCode gocode使用的自动完成引擎似乎期望找到生成的源,而不是,因此失败.vim-gobzlbazel-genfiles/bazel-bin/

如何修改我的规则以保存输出bazel-genfiles/而不是bazel-bin/?我的规则等同于以下示例rules_go:

    def _bindata_impl(ctx):
      out = ctx.new_file(ctx.label.name + ".go")
      ctx.action(
        inputs = ctx.files.srcs,
        outputs = [out],
        executable = ctx.file._bindata,
        arguments = [
            "-o", out.path, 
            "-pkg", ctx.attr.package,
            "-prefix", ctx.label.package,
        ] + [src.path for src in ctx.files.srcs],
      )
      return [
        DefaultInfo(
          files = depset([out])
        ) 
      ]

    bindata = rule(
        _bindata_impl,
        attrs = {
            "srcs": attr.label_list(allow_files = True, cfg = "data"),
            "package": attr.string(mandatory=True),
            "_bindata":  attr.label(allow_files=True, single_file=True, default=Label("@com_github_jteeuwen_go_bindata//go-bindata:go-bindata")),
        },
    )
Run Code Online (Sandbox Code Playgroud)

我希望在Skylark参考或教程中找到ctx.new_file或者ctx.action找不到任何相关的参数.

非常感谢!

小智 6

尝试output_to_genfiles=Truerule()定义中进行设置.它在规则文档中提到.

所以:

bindata = rule(
        _bindata_impl,
        attrs = {
            "srcs": attr.label_list(allow_files = True, cfg = "data"),
            "package": attr.string(mandatory=True),
            "_bindata":  attr.label(allow_files=True, single_file=True, default=Label("@com_github_jteeuwen_go_bindata//go-bindata:go-bindata")),
        },
        output_to_genfiles = True,
    )
Run Code Online (Sandbox Code Playgroud)