簡體   English   中英

如何將數組從 Bazel cli 傳遞給規則?

[英]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可能適合您。

如果您確實需要標簽列表,並且已知不同的可能值,那么您可以使用--defineconfig_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM