[英]How to pass an array from Bazel cli to rules?
假設我有這樣的規則。
foo(
name = "helloworld",
myarray = [
":bar",
"//path/to:qux",
],
)
在這種情況下, myarray
是 static。但是,我希望它由 cli 給出,比如
bazel run //:helloworld --myarray=":bar,//path/to:qux,:baz,:another"
這怎么可能?
謝謝
為了准確獲得您的要求,Bazel 需要在 Starlark 定義的命令行標志中支持LABEL_LIST
,這些標志記錄在此處:
https://docs.bazel.build/versions/2.1.0/skylark/lib/config.html
在這里: https://docs.bazel.build/versions/2.1.0/skylark/config.html
不幸的是,目前還沒有實施。
如果您實際上不需要標簽列表(即,創建目標之間的依賴關系),那么STRING_LIST
可能適合您。
如果您確實需要標簽列表,並且已知不同的可能值,那么您可以使用--define
、 config_setting()
和select()
:
https://docs.bazel.build/versions/2.1.0/configurable-attributes.html
問題是,你真正追求的是什么。 將變量、數組傳遞到bazel build/run
中實際上是不可能的,不是這樣的,也不是(大部分)沒有(很可能不需要的)副作用。 您不是真的只是在考慮將 arguments 直接傳遞給run
正在運行的內容嗎? 即將它傳遞給可執行文件本身,而不是 bazel?
幾乎沒有什么方法可以偷偷摸摸(在大多數情況下,您還需要想出一種語法來在 CLI 上傳遞數據並在規則中解壓縮數組),但許多方法的價格都相對較高。
您可以在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
:您可以收集有關您的環境的信息,添加一個或兩個結果文件(取決於輸入是否意味着使規則結果無效,您可以使用易失性或穩定狀態文件)作為您的依賴項規則並處理規則正在執行的傳入文件(此時人們會想知道為什么不將其作為命令行 arguments 直接傳遞)。 如果使用穩定狀態文件,則依賴於它的其他規則也會因任何更改而失效。
--action_env
做類似的事情。 從支撐規則的可執行文件/工具/腳本中,您可以直接訪問定義的環境變量。 然而,這也意味着每條規則的環境都會受到影響(不僅僅是你的目標); 再一次,為什么它會解析來自環境的信息而不在命令行上接受 arguments。--define
,但您不會真正直接訪問它的價值,因為您可以select()
從可能的選項中進行選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.