2017-08-09 40 views
4

我們正在生成一些Go源文件作爲我們構建的一部分。之前我們使用了genruleexample here),導致生成的文件存儲在bazel-genfiles/中。如何將自定義規則的輸出放在`bazel-genfiles /`而不是`bazel-out /`中?

我們最近切換到使用rules_gohttps://github.com/bazelbuild/rules_go/tree/master/examples/bindata)中演示的自定義規則。此更改意味着輸出源文件存儲在bazel-bin/而不是bazel-genfiles/中。

輸出位置的這種變化已經打破了我們開發人員使用的一些IDE中的Go集成。值得注意的是,在bzl(Bazel)查找模式下運行時,vim-go和VSCode使用的自動補全引擎gocode似乎預計會在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_filectx.action卻找不到在雲雀參考或教程任何相關信息。

非常感謝!

回答

6

嘗試在rule()定義中設置output_to_genfiles=True。它在rule 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, 
    ) 
+0

完美,謝謝! – user2514169