如何将数组从Bazel CLI传递到规则?

时间:2020-02-24 15:55:19

标签: bazel

假设我有这样的规则。

  A a =  new B();
  a.f();

在这种情况下,foo( name = "helloworld", myarray = [ ":bar", "//path/to:qux", ], ) 是静态的。 但是,我希望它由cli给出,例如

myarray

这怎么可能?

谢谢

2 个答案:

答案 0 :(得分:0)

要完全获得您的要求,Bazel需要在Starlark定义的命令行标志中支持UserService,这些标志在此处记录:

https://docs.bazel.build/versions/2.1.0/skylark/lib/config.html

此处:https://docs.bazel.build/versions/2.1.0/skylark/config.html

不幸的是,目前尚未实现。

如果您实际上不需要标签列表(例如,在目标之间创建依赖关系),那么LABEL_LIST可能会为您服务。

如果您确实需要标签列表,并且知道了不同的​​可能值,则可以使用STRING_LIST--defineconfig_setting()

https://docs.bazel.build/versions/2.1.0/configurable-attributes.html

答案 1 :(得分:0)

问题是,您真正追求的是什么。确实不可能将变量array传递到bazel build/run中,也不是这样,并且(主要)没有(很可能是不需要的)副作用。您可能不是真的只是直接将参数传递给run正在运行的参数吗?即传递给可执行文件本身,而不是无聊吗?

您可以采用几种方法来偷偷摸摸(大多数情况下,您还需要提供一种语法以在CLI上传递数据并按规则对数组进行解压缩),但是许多方法都需要相对较高的价格。< / p>

  • 您可以在bzl文件中定义数组,然后从规则使用它的位置加载它。然后,您可以转储bzl内容以重写构建/运行配置(也使其变得明显,可跟踪),并从规则中加载位(仅影响规则的加载和使用变量)。例如BUILD文件:

    load(":myarray.bzl", "myarray")
    foo(
        name = "helloworld",
        myarray = myarray,
        ],
    )
    

    然后您可以调用您的构建:

    $ echo 'myarray=[":bar", "//path/to:qux", ":baz", ":another"]' > myarray.bzl
    $ bazel run //:helloworld 
    

    您当然可以放入一个包装器脚本中。如果确实需要一个bazel数组,那么这可能是最干净的方法。

  • --workspace_status_command:您可以收集有关环境的信息,添加一个或两个结果文件(取决于输入是否旨在使规则结果无效,您可以使用volatile或稳定状态文件)作为您规则的依赖项,并在规则执行的内容中处理传入文件(此时,您会想知道为什么不直接将其作为命令行参数传递给它)。如果使用稳定状态文件,则依赖于该文件的其他规则也会因任何更改而失效。

  • 您可以使用--action_env做类似的事情。在规则的可执行文件/工具/脚本中,您可以直接访问定义的环境变量。但是,这也意味着每条规则的环境都会受到影响(而不仅仅是您要针对的规则);再次,为什么它会解析环境中的信息,而不在命令行上接受参数。
  • 也有--define,但您可能无法真正获得直接访问它的价值,select()从可能的选择中进行选择。