2017-08-09 2 views
4

Wir erzeugen eine Reihe von Go-Quelldateien als Teil unseres Builds. Zuvor verwendeten wir einen genrule (example here), der dazu führte, dass die generierten Dateien in bazel-genfiles/ gespeichert wurden.Wie stelle ich die Ausgabe einer benutzerdefinierten Regel in `bazel-genfiles /` anstelle von `bazel-out /`?

Wir haben kürzlich auf eine benutzerdefinierte Regel umgestellt, wie in rules_go (https://github.com/bazelbuild/rules_go/tree/master/examples/bindata) gezeigt. Diese Änderung bedeutet, dass die Ausgangsquelldateien in bazel-bin/ statt bazel-genfiles/ gespeichert sind.

Diese Änderung der Ausgabestelle hat die Go-Integration in einige der von unseren Entwicklern verwendeten IDEs unterbrochen. Bemerkenswert ist, gocode, die Autovervollständigung-Engine von vim-go und VSCode verwendet, wenn in bzl (Bazel) Lookup-Modus ausgeführt scheint zu erwarten, dass Quellen in bazel-genfiles/, nicht bazel-bin/, und schlägt daher fehl.

Wie ändere ich meine Regel, um die Ausgabe auf bazel-genfiles/ statt bazel-bin/ zu speichern? Meine Regel ist äquivalent zum Beispiel in 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")), 
     }, 
    ) 

ich ein Argument entweder zu ctx.new_file oder ctx.action erwarten würde, aber kann nichts relevant im Skylark Referenz oder ein Tutorial finden.

Vielen Dank!

Antwort

6

Versuchen Sie output_to_genfiles=True in der rule() Definition. Es wird in der rule docs erwähnt.

So:

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

Perfect, danke! – user2514169

Verwandte Themen