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

How to put the output of a custom rule in `bazel-genfiles/` instead of `bazel-out/`?

我们正在生成一些 Go 源文件作为构建的一部分。之前我们使用 genrule (example here) 导致生成的文件存储在 bazel-genfiles/.

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

这种输出位置的变化破坏了我们开发人员使用的一些 IDE 中的 Go 集成。值得注意的是,gocodevim-go 和 VSCode 使用的自动完成引擎,当 bzl (Bazel) 查找模式中的 运行 似乎期望在bazel-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")),
        },
    )

我希望对 ctx.new_file or ctx.action 进行论证,但在 Skylark 参考或教程中找不到任何相关内容。

非常感谢!

尝试在 rule() 定义中设置 output_to_genfiles=Truerule docs.

中提到

所以:

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,
    )