動作

提供函式來建立動作的模組。使用 ctx.actions 存取這個模組。

成員

args

Args actions.args()

傳回 Args 物件,可用於建構節省記憶體的指令列。

declare_directory

File actions.declare_directory(filename, *, sibling=None)

宣告規則或構面會在目前套件中建立具有指定名稱的目錄。您必須建立產生目錄的動作。目錄內容無法直接從 Starlark 存取,但可使用 Args.add_all() 在動作指令中展開。

參數

參數 說明
filename 必要
如果未提供「同層級」,則為新目錄的路徑,相對於目前的套件。否則為檔案的基本名稱 (「同層級」會定義目錄)。
sibling File; or None; default = None
與新宣告目錄位於同一目錄的檔案。檔案必須位於目前的套件中。

declare_file

File actions.declare_file(filename, *, sibling=None)

宣告規則或構面會建立具有指定檔案名稱的檔案。如果未指定 sibling,檔案名稱會與套件目錄相關,否則檔案會位於與 sibling 相同的目錄中。檔案無法在目前的套件外建立。

請注意,除了宣告檔案外,您還必須另外建立會發出檔案的動作。建立該動作時,需要將傳回的 File 物件傳遞至動作的建構函式。

請注意,預先宣告的輸出檔案不需要 (且無法) 使用這個函式宣告。您可以改用 ctx.outputs 取得這些物件的 File 物件。查看使用範例

參數

參數 說明
filename 必要
如果未提供「同層級」,則為新檔案的路徑,相對於目前的套件。否則為檔案的基本名稱 (「同層」會決定目錄)。
sibling File; or None; default = None
與新建立的檔案位於同一目錄中的檔案。檔案必須位於目前的套件中。

File actions.declare_symlink(filename, *, sibling=None)

實驗。這項參數仍在實驗階段,因此隨時可能變動。因此請勿依賴這項功能。您可以設定 --experimental_allow_unresolved_symlinks,以實驗性質啟用這項功能

宣告規則或構面會在目前的套件中建立具有指定名稱的符號連結。您必須建立會產生這個符號連結的動作。Bazel 絕不會取消參照這個符號連結,而是會逐字轉移至沙箱或遠端執行器。

參數

參數 說明
filename 必要
如果未提供「同層級」,則為相對於目前套件的新符號連結路徑。否則為檔案的基本名稱 (「同層級」會定義目錄)。
sibling File; or None; default = None
與新宣告的符號連結位於同一目錄中的檔案。

do_nothing

None actions.do_nothing(mnemonic, inputs=[])

建立空白動作,既不會執行指令,也不會產生任何輸出內容,但可用於插入「額外動作」。

參數

參數 說明
mnemonic 必要
動作的單字說明,例如 CppCompile 或 GoLink。
inputs sequence of Files; or depset; default = []
動作的輸入檔案清單。

expand_template

None actions.expand_template(template, output, substitutions={}, is_executable=False, computed_substitutions=unbound)

建立範本擴展動作。執行動作時,系統會根據範本產生檔案。範本的部分內容會依據指定的替換順序,使用 substitutions 字典替換。每當字典的鍵出現在範本 (或先前替換的結果) 中,系統就會將其替換為相關聯的值。金鑰沒有特殊語法,舉例來說,您可以使用大括號來避免衝突 (例如 {KEY})。查看使用範例

參數

參數 說明
template 必要
範本檔案,也就是採用 UTF-8 編碼的文字檔案。
output 必要
輸出檔案,為 UTF-8 編碼的文字檔案。
substitutions default = {}
展開範本時要進行的替換作業。
is_executable default = False
輸出檔案是否應為可執行檔。
computed_substitutions TemplateDict; default = unbound
Experimental. 這項參數仍在實驗階段,因此隨時可能變動。因此請勿依賴這項功能。您可以設定 --+experimental_lazy_template_expansion
Experimental,以實驗方式啟用這項功能。展開範本時要進行的替換作業。

得分

None actions.run(outputs, inputs=[], unused_inputs_list=None, executable, tools=unbound, arguments=[], mnemonic=None, progress_message=None, use_default_shell_env=False, env=None, execution_requirements=None, input_manifests=None, exec_group=None, shadowed_action=None, resource_set=None, toolchain=None)

建立執行可執行檔的動作。查看使用範例

參數

參數 說明
outputs sequence of Files;必要
動作的輸出檔案清單。
inputs sequence of Files; or depset; default = []
動作的輸入檔案清單或 depset。
unused_inputs_list File; or None; default = None
檔案,內含動作未使用的輸入內容清單。

這個檔案的內容 (通常是動作的其中一個輸出內容) 對應於整個動作執行期間未使用的輸入檔案清單。這些檔案的任何變更不得以任何方式影響動作的輸出。

executable File; or string; or FilesToRunProvider; required
The executable file to be called by the action.
tools sequence; or depset; default = unbound
動作所需的任何工具清單或 depset。工具是輸入內容,其中包含自動提供給動作的其他執行檔。如果提供清單,可以是檔案、FilesToRunProvider 執行個體或檔案 depsets 的異質集合。清單中直接來自 ctx.executable 的檔案會自動新增執行檔。如果提供 depsets,則只能包含檔案。在這兩種情況下,depsets 中的檔案都不會與 ctx.executable 交叉參照,以取得執行檔。
arguments sequence; 預設值 = []
動作的指令列引數。必須是字串清單或 actions.args() 物件。
mnemonic string; or None; default = None
動作的單字說明,例如 CppCompile 或 GoLink。
progress_message string; or None; default = None
建構期間向使用者顯示的進度訊息,例如「正在編譯 foo.cc 以建立 foo.o」。訊息可能包含 %{label}%{input}%{output} 模式,分別會替換為標籤字串、第一個輸入內容或輸出內容的路徑。建議使用模式而非靜態字串,因為前者效率較高。
use_default_shell_env default = False
動作是否應使用內建的 Shell 環境。
env dict; or None; default = None
設定環境變數的字典。
execution_requirements dict; or None; default = None
Information for scheduling the action. 如需實用鍵,請參閱標記
input_manifests sequence; or None; default = None
(Experimental) sets the input runfiles metadata; they are typically generated by resolve_command.
exec_group string; or None; default = None
Runs the action on the given exec group's execution platform. 如果沒有,則使用目標的預設執行平台。
shadowed_action Action; default = None
使用指定陰影動作的輸入內容和環境執行動作,並將這些內容新增至動作的輸入內容清單和環境。動作環境可以覆寫任何陰影動作的環境變數。如果沒有,則只會使用動作的輸入內容和指定環境。
resource_set callable; or None; default = None
A callback function that returns a resource set dictionary, used to estimate resource usage at execution time if this action is run locally.

這個函式接受兩個位置引數:代表 OS 名稱的字串 (例如「osx」),以及代表動作輸入數量的整數。傳回的字典可能包含下列項目,每個項目可能是浮點數或整數:

  • 「cpu」:CPU 數量,預設為 1
  • 「memory」:以 MB 為單位,預設為 250
  • 「local_test」:本機測試次數,預設為 1

如果這個參數設為 None--experimental_action_resource_set 為 false,系統會使用預設值。

回呼必須是頂層函式 (不允許使用 lambda 和巢狀函式)。

toolchain Label; or string; or None; default = None

這項動作中使用的可執行檔或工具的工具鍊類型。必須設定參數,動作才能在正確的執行平台上執行。

目前這項屬性不會執行任何作業,但我們建議您在使用工具鍊時設定這項屬性,因為日後的 Bazel 版本會要求您這麼做。

請注意,建立這項動作的規則需要在「rule()」函式中定義這個工具鍊。

如果同時設定 `toolchain` 和 `exec_group` 參數,系統會使用 `exec_group`。如果 `exec_group` 未指定相同項目,系統會引發錯誤。

run_shell

None actions.run_shell(outputs, inputs=[], tools=unbound, arguments=[], mnemonic=None, command, progress_message=None, use_default_shell_env=False, env=None, execution_requirements=None, input_manifests=None, exec_group=None, shadowed_action=None, resource_set=None, toolchain=None)

建立執行 Shell 指令的動作。查看使用範例

參數

參數 說明
outputs sequence of Files;必要
動作的輸出檔案清單。
inputs sequence of Files; or depset; default = []
動作的輸入檔案清單或 depset。
tools sequence of Files; or depset; default = unbound
動作所需的任何工具清單或 depset。工具是輸入內容,其中包含自動提供給動作的其他執行檔。清單可以包含 Files 或 FilesToRunProvider 執行個體。
arguments sequence; 預設值 = []
動作的指令列引數。必須是字串清單或 actions.args() 物件。

Bazel 會將這個屬性中的元素做為引數傳遞至指令。指令可以使用殼層變數替換 (例如 $1$2 等) 存取這些引數。請注意,由於 Args 物件會在編製索引前扁平化,如果 Args 物件的大小不明,後續所有字串都會位於無法預測的索引。如果 Args 物件的大小不確定,搭配使用 $@ (擷取所有引數) 可能會很有用。

如果 command 是字串清單,可能無法使用這個參數。

mnemonic string; or None; default = None
動作的單字說明,例如 CppCompile 或 GoLink。
command string; or sequence of strings; 必要
要執行的殼層指令。這可以是字串 (建議) 或字串序列 (已淘汰)

如果 command 是字串,則會以 sh -c <command> "" <arguments> 執行,也就是說,arguments 中的元素會以 $1$2 (或 %1%2,如果使用 Windows 批次) 等形式提供給指令。如果 arguments 包含任何 actions.args() 物件,其內容會逐一附加至指令列,因此 $i 可以參照 Args 物件中的個別字串。請注意,如果將大小不明的 Args 物件做為 arguments 的一部分傳遞,字串就會位於不明的索引;在這種情況下,$@ 殼層替代 (擷取所有引數) 可能會很有用。

(已淘汰) 如果 command 是字串序列,第一個項目是要執行的可執行檔,其餘項目則是引數。如果使用這個表單,請勿提供 arguments 參數。請注意,這份表單已淘汰,近期內會移除。這個標記會停用 `--incompatible_run_shell_command_string`。請使用這個標記確認程式碼是否相容。

Bazel 會使用與 genrule 相同的殼層執行指令。

progress_message string; or None; default = None
建構期間向使用者顯示的進度訊息,例如「正在編譯 foo.cc 以建立 foo.o」。訊息可能包含 %{label}%{input}%{output} 模式,分別會替換為標籤字串、第一個輸入內容或輸出內容的路徑。建議使用模式而非靜態字串,因為前者效率較高。
use_default_shell_env default = False
動作是否應使用內建的 Shell 環境。
env dict; or None; default = None
設定環境變數的字典。
execution_requirements dict; or None; default = None
Information for scheduling the action. 如需實用鍵,請參閱標記
input_manifests sequence; or None; default = None
(Experimental) sets the input runfiles metadata; they are typically generated by resolve_command.
exec_group string; or None; default = None
Runs the action on the given exec group's execution platform. 如果沒有,則使用目標的預設執行平台。
shadowed_action Action; default = None
使用新增至動作輸入清單的指定陰影動作探索到的輸入內容,執行動作。如果沒有,則只會使用動作的輸入內容。
resource_set callable; or None; default = None
在本地執行時,用於估算資源用量的回呼函式。請參閱ctx.actions.run()
toolchain Label; or string; or None; default = None

這項動作中使用的可執行檔或工具的工具鍊類型。必須設定參數,動作才能在正確的執行平台上執行。

目前這項屬性不會執行任何作業,但我們建議您在使用工具鍊時設定這項屬性,因為日後的 Bazel 版本會要求您這麼做。

請注意,建立這項動作的規則需要在「rule()」函式中定義這個工具鍊。

如果同時設定 `toolchain` 和 `exec_group` 參數,系統會使用 `exec_group`。如果 `exec_group` 未指定相同的工具鍊,系統就會引發錯誤。

None actions.symlink(output, target_file=None, target_path=None, is_executable=False, progress_message=None)

建立會在檔案系統中寫入符號連結的動作。

呼叫這個函式時,必須指定 target_filetarget_path 其中一個。

使用 target_file 時,請使用 declare_file()declare_directory() 宣告 output,並比對 target_file 的類型。這會讓符號連結指向 target_file。每當符號連結的目標或內容變更時,Bazel 就會使這項動作的輸出內容失效。

否則,當您使用 target_path 時,請使用 declare_symlink() 宣告 output。在這種情況下,符號連結會指向 target_path。Bazel 絕不會解析符號連結,只有在符號連結的文字內容 (即 readlink() 的值) 變更時,這個動作的輸出內容才會失效。特別是,這可用於建立懸空符號連結。

參數

參數 說明
output 必要
這項動作的輸出內容。
target_file File; or None; default = None
The File that the output symlink will point to.
target_path string; or None; default = None
(Experimental) The exact path that the output symlink will point to. 系統不會執行任何正規化或其他處理作業。如要使用這項功能,必須設定 --experimental_allow_unresolved_symlinks
is_executable default = False
只能與 target_file 搭配使用,不能與 target_path 搭配使用。如果為 true,執行動作時,系統會檢查 target_file 的路徑,確認是否可執行,如果無法執行,系統會回報錯誤。將 is_executable 設為 False 並不代表目標無法執行,只是不會進行驗證。

這項功能不適用於 target_path,因為懸置符號連結可能在建構時不存在。

progress_message string; or None; default = None
Progress message to show to the user during the build.

template_dict

TemplateDict actions.template_dict()

實驗。這項 API 仍在實驗階段,隨時可能變更。因此請勿依賴這項功能。您可以設定 --+experimental_lazy_template_expansion
Experimental:傳回 TemplateDict 物件,以利節省記憶體的方式擴充範本。

寫入

None actions.write(output, content, is_executable=False)

建立檔案寫入動作。執行動作時,系統會將指定內容寫入檔案。這項功能會使用分析階段提供的資訊產生檔案。如果檔案很大且包含大量靜態內容,建議使用 expand_template

參數

參數 說明
output 必要
輸出檔案。
content string; or Args; 必要
檔案內容。可以是字串或 actions.args() 物件。
is_executable default = False
輸出檔案是否應為可執行檔。