假设我有这样的规则。
A a = new B();
a.f();
在这种情况下,foo(
name = "helloworld",
myarray = [
":bar",
"//path/to:qux",
],
)
是静态的。
但是,我希望它由cli给出,例如
myarray
这怎么可能?
谢谢
答案 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
,--define
和config_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()
从可能的选择中进行选择。