引數

回報問題 查看來源

透過封裝記憶體的方式封裝物件,也就是建構部分或所有指令列所需的資料。

一般而言,這個動作需要較大的指令列,其中包含從遞移依附元件累積的值。舉例來說,連結器指令列可能會列出所有已連結程式庫所需的每個物件檔案。建議您將這類遞移資料儲存在 depset 中,以便共用多個目標。但是,如果規則作者必須將這些依附元件轉換為字串清單,才能建構動作指令列,這會導致記憶體分享最佳化。

因此,除了建構字串之外,動作建構函式也會接受 Args 物件。每個 Args 物件都代表字串和反轉性,並包含選用轉換指令。Args 物件在計算指令列時,不會處理封裝的延遲。這樣在分析階段結束後,就可以繼續付出任何昂貴的複製作業。詳情請參閱「最佳化成效」頁面。

透過呼叫 ctx.actions.args() 來建構 Args。而且可以做為 ctx.actions.run()ctx.actions.run_shell()arguments 參數傳遞。Args 物件的每項異動都會附加至最終的指令列。

map_each 功能可讓您自訂項目轉換為字串的方式。如未提供 map_each 函式,標準轉換如下:

  • 既有字串的值會保持原樣。
  • File 物件會變成 File.path 值。
  • 所有其他類型都會以「未指定」的方式轉換為字串。因此,請避免將非字串或 File 類型的值傳遞至 add()。如果您將這些值傳遞至 add_all()add_joined(),則應提供 map_each 函式。

使用字串格式 (add*() 方法的 formatformat_eachformat_joined 參數) 時,格式範本與字串的 % 替代項目相同,差別在於範本必須有一個替代預留位置,且必須為 %s。常值百分比可能會逸出為 %%。按照上述方式將值轉換為字串後,系統就會套用格式設定。

每個 add*() 方法都有一個替代格式,可接受額外的位置參數,也就是另一個引數之前插入的「arg name」字串。對於 add_alladd_joined,如果序列為空白,系統就不會新增額外的字串。舉例來說,視特定序列中的 val1..val3 或空白而定,相同的使用方式可以在指令列中加入 --foo val1 val2 val3 --bar--bar

如果指令列大小超過系統允許的大小上限,引數可能會溢位至參數檔案。請參閱 use_param_file()set_param_file_format()

例如,假設要產生指令列:

--foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --baz
我們可以使用以下 Args 物件:
# foo_deps and bar_deps are depsets containing
# File objects for the foo and bar .txt files.
args = ctx.actions.args()
args.add_all("--foo", foo_deps)
args.add_joined("--bar", bar_deps, join_with=",")
args.add("--baz")
ctx.actions.run(
  ...
  arguments = [args],
  ...
)

成員

add

Args Args.add(arg_name_or_value, value=unbound, *, format=None)

將引數附加至這個指令列。

參數

參數 說明
arg_name_or_value 必要
如果傳遞兩個位置參數,系統會將其解讀為引數名稱。系統會在名稱後方加上引數名稱,而不處理任何作業。如果只傳遞一個位置參數,系統會將其解讀為 value (詳見下文)。
value default = unbound
要附加的物件。系統會使用上述標準轉換來將字串轉換為字串。由於此函式沒有 map_each 參數,因此 value 應為字串或 File。清單、元組、解碼或目錄 File 必須傳遞至 add_all()add_joined(),而非這個方法。
format string; or None; default = None
要套用至 value 字串化版本的格式字串模式。

新增全部

Args Args.add_all(arg_name_or_values, values=unbound, *, map_each=None, format_each=None, before_each=None, omit_if_empty=True, uniquify=False, expand_directories=True, terminate_with=None, allow_closure=False)

將多個引數附加至這個指令列。系統會在執行階段延遲處理這些項目。

大部分程序都會依照要附加的引數清單執行,如下所示:

  1. 每個目錄 File 項目都會替換成該目錄中的週期性所有 File
  2. 如果指定 map_each,系統會將其套用至每個項目,而產生的字串清單會經過串連,形成初始引數清單。否則,初始引數清單就是將標準轉換套用到每個項目的結果。
  3. 清單中的每個引數都設定為 format_each 的格式 (如果有的話)。
  4. 如果 uniquify 為 true,就會移除重複的引數。首次發生時就保留著第一個。
  5. 如果提供 before_each 字串,系統會將字串插入為清單中每個現有引數之前的新引數。可有效增加在這個時間點附加的引數數量。
  6. 除非清單為空白,且 omit_if_empty 為 true (預設),否則引數和 terminate_with 會分別插入第一個和最後一個引數 (如果已指定)。
請注意,空字串是有效的引數,必須遵守這些處理步驟。

參數

參數 說明
arg_name_or_values 必要
如果傳遞兩個位置參數,系統會將其解讀為引數名稱。引數名稱會在 values 前面新增為獨立引數,且不會處理。如果 omit_if_empty 為 true (預設值),且沒有附加其他項目 (例如 values 為空白或所有所有項目遭到篩選),系統就不會新增這個引數名稱。如果只傳遞一個位置參數,系統會將其解讀為 values (詳見下文)。
values sequence; or depset; 預設 = 不繫結
要附加項目的清單、元組或解除繫結。
map_each callable; or None; 預設 = 無
此函式會將每個項目轉換為零或多個字串,並在附加之前進一步處理。如未提供這個參數,則會使用標準轉換。

系統會傳遞一或兩個位置引數:要轉換的項目,然後加上選用的 DirectoryExpander。只有在提供的函式是使用者定義 (非內建) 並宣告多個參數時,系統才會傳遞第二個引數。

傳回值的類型取決於要為商品產生的引數數量:

  • 常見的情況是,當每個項目成為一個字串時,這個函式應傳回該字串。
  • 如果項目完全被篩除,函式應會傳回 None
  • 如果項目變成多個字串,函式會傳回這些字串的清單。
傳回單一字串或 None 的效果會分別傳回長度 1 或長度 0 的清單。不過,為了省時省力,請避免建立不需要的清單。

一般而言,在設定 expand_directories=True 後,這些目錄的項目會自動展開。但是,這不會展開其他值中包含的目錄,例如項目是具有目錄的目錄時。在這種情況下,您可以套用 DirectoryExpander 引數,手動取得指定目錄的檔案。

為避免在測試階段中不小心將大型分析階段的資料結構保留,您必須以頂層 def 陳述式宣告 map_each 函式,這可以是預設的關閉函式。

警告:map_each 呼叫期間執行的 print() 陳述式不會產生任何可見的輸出內容。

format_each string; or None; 預設 = 無
選用格式字串模式,適用於 map_each 函式傳回的每個字串。格式字串只能包含一個「%s」預留位置。
before_each string; or None; default = None
要附加從 values 衍生的每個引數後方要附加的選用引數。
omit_if_empty default = True
如果為 true,沒有附加任何從 values 衍生的引數時,系統會封鎖所有後續處理作業,且指令列將維持不變。設為 false 時,無論引數是否包含其他引數,系統仍會附加引數名稱和 terminate_with (如果有的話)。
uniquify default = False
如果為 true,系統會略過從 values 衍生的重複引數。系統只會保留每個引數的第一個出現結果。通常不需要這項功能,因為 Depset 已省略重複的項目,但如果 map_each 發出多個項目的相同字串,這個功能就非常實用。
expand_directories default = True
若為 true,values 中的所有目錄都會展開成平面檔案清單。會在套用 map_each 之前完成這項操作。
terminate_with string; or None; default = None
所有其他引數後方應附加的選用引數。如果 omit_if_empty 為 true (預設),且沒有附加其他項目,系統就不會新增這個引數 (如果 values 為空白,或所有項目都遭到篩除)。
allow_closure default = False
如為 true,則允許在函式參數中使用關閉參數,例如 map_each。您通常不需要這麼做,這麼做也可能導致應用程式在分析階段保留大型分析階段資料結構。

add_joined

Args Args.add_joined(arg_name_or_values, values=unbound, *, join_with, map_each=None, format_each=None, format_joined=None, omit_if_empty=True, uniquify=False, expand_directories=True, allow_closure=False)

使用分隔符將多個值串連成指令列,藉此將引數附加至這個指令列。系統會在執行階段延遲處理這些項目。

處理方式與 add_all() 相似,但從 values 衍生的引數清單會合併為單一引數,就像 join_with.join(...) 並使用指定 format_joined 字串範本的格式呈現。與 add_all() 不同,由於沒有將項目合併為單一引數,這些參數沒有 before_eachterminate_with 參數。

如果在篩選後沒有要加入引數的字串,且 omit_if_empty 為 true (預設),則系統不會處理任何作業。如果沒有要合併的字串,但 omit_if_empty 為 false,則彙整的字串將為空白字串。

參數

參數 說明
arg_name_or_values 必要
如果傳遞兩個位置參數,系統會將其解讀為引數名稱。引數名稱會在 values 之前加入,且不會處理。如果 omit_if_empty 為 true (預設),且系統不會從 values 衍生字串來合併這個引數,那麼這個引數就不會新增 (如果 values 為空白,或所有項目遭到篩除,就會發生這種情況)。如果只傳遞一個位置參數,系統會將其解讀為 values (詳見下文)。
values sequence; or depset; = 無限制
要加入項目的清單、元組或解除對清單。
join_with 必要
用於將套用 map_eachformat_each 所取得的字串合併,與 string.join() 使用的方式相同。
map_each callable; or None; default = 無
add_all 相同。
format_each string; or None; default = 無
add_all 相同。
format_joined string; or None; default = None
已套用至字串的選用格式字串模式。格式字串只能包含一個「%s」預留位置。
omit_if_empty default = True
如果為 true,沒有要合併的字串 (無論是 values 為空白或是已篩選所有項目),則所有後續處理皆會抑制,指令列則會維持不變。如果為 false,即使沒有任何要合併的字串,系統也會附加兩個引數:引數名稱後會加上空白字串 (也就是零字串的邏輯彙整)。
uniquify default = False
add_all 相同。
expand_directories default = True
add_all 相同。
allow_closure default = False
add_all 相同。

set_param_file_format

Args Args.set_param_file_format(format)

設定參數檔案的格式 (如果使用的話)

參數

參數 說明
format 必填
必須是下列其中一項:
  • "multiline":每個項目 (引數或值) 都會以參數形式寫入參數檔案,並在後面加上新行字元。
  • "shell":與 "lineline" 相同,但項目為殼層引用
  • "flag_per_line": 與「多行」相同,但 (1) 只有旗標 (開頭為「--」) 會寫入參數檔案,以及 (2) 標記值 (如果有的話) 會以同一行,以「='」分隔符寫入。這是 Abseil 旗標程式庫預期的格式。

如果未呼叫,格式會預設為「殼層」。

使用參數參數

Args Args.use_param_file(param_file_arg, *, use_always=False)

將引數傳送至參數檔案,並替換為參數檔案的指標。使用引數過大可能會超過系統指令長度限制時使用。

Bazel 可能會在執行時選擇將參數檔案寫入輸出樹狀結構,藉此提高效率。如果您要偵錯操作,並想檢查參數檔案,請將 --materialize_param_files 傳遞給建構檔案。

參數

參數 說明
param_file_arg 必要
含有單一「%s」的格式字串。如果引數溢出至參數檔案,則引數會替換成以字串檔案路徑形式組成的字串,並由引數組成。

例如,如果引數會溢出至參數檔案「params.txt」,那麼指定「--file=%s」會導致動作指令列包含「--file=params.txt」。

use_always default = False
一律一律將引數溢出至參數檔案。如為 false,Bael 會根據系統和引數長度,判斷引數是否需要溢出引數。