執行群組允許在單一目標中使用多個執行平台。 每個執行群組都有自己的工具鍊依附元件 自行執行工具鍊解析。
背景
執行群組可讓規則作者定義動作組合,每個動作組都具備 可能不同的執行平台多個執行平台 如何執行不同動作,例如編譯遠端的 iOS 應用程式 (linux) 工作站,然後在本機 mac 工作站上連結/程式碼簽署。
定義動作群組也有助於減輕動作的使用率 也就是替代記憶庫,以便指定動作。倫理不保證會 不重複的,且只能參照一項動作。這在 將額外資源分配至特定記憶體並處理大量操作 例如連結 C++ 建構作業中的連結,而不將資源過度分配給較嚴苛的工作。
定義執行群組
在規則定義期間,規則作者可以
宣告
一組執行群組在每個執行群組中,規則作者可以指定
為執行群組選擇執行平台所需的一切
也就是透過 exec_compatible_with
和工具鍊類型的任何限制
toolchain
。
# foo.bzl
my_rule = rule(
_impl,
exec_groups = {
“link”: exec_group(
exec_compatible_with = [ "@platforms//os:linux" ]
toolchains = ["//foo:toolchain_type"],
),
“test”: exec_group(
toolchains = ["//foo_tools:toolchain_type"],
),
},
attrs = {
"_compiler": attr.label(cfg = config.exec("link"))
},
)
您可以在上方的程式碼片段中,看到工具依附元件也可以指定
使用
cfg
敬上
屬性和
config
。
後續課程我們將逐一介紹
預先訓練的 API、AutoML 和自訂訓練這個模組會公開採用單一字串的 exec
函式
參數,為依附元件應加入的 exec 群組名稱
。
和原生規則一樣,test
執行群組預設會顯示在 Starlark 中
測試規則
存取執行群組
在規則實作中,您可以宣告應在
執行群組的執行平台方法是使用 exec_group
動作產生方法的參數,特別是 ctx.actions.run
和
ctx.actions.run_shell
。
# foo.bzl
def _impl(ctx):
ctx.actions.run(
inputs = [ctx.attr._some_tool, ctx.srcs[0]]
exec_group = "compile",
# ...
)
規則作者也將可存取已解析的工具鍊 和建立執行群組的方式類似 可以存取目標已解析的工具鍊:
# foo.bzl
def _impl(ctx):
foo_info = ctx.exec_groups["link"].toolchains["//foo:toolchain_type"].fooinfo
ctx.actions.run(
inputs = [foo_info, ctx.srcs[0]]
exec_group = "link",
# ...
)
使用執行群組設定執行屬性
執行群組已與
exec_properties
敬上
屬性,而且可讓目標寫入者指定
會傳遞給執行機器的屬性字串字典。適用對象
假設您要為目標設定一些屬性 (例如記憶體)
因此需要編寫較高記憶體配置的 exec_properties
具有 run-group-ugment 鍵的項目,例如:
# BUILD
my_rule(
name = 'my_target',
exec_properties = {
'mem': '12g',
'link.mem': '16g'
}
…
)
所有含有 exec_group = "link"
的動作都會顯示 exec 屬性
字典格式:{"mem": "16g"}
。如您所見,執行群組層級
會覆寫目標層級的設定
原生規則的執行群組
以下執行群組適用於原生規則定義的動作:
test
:測試執行器動作。cpp_link
:C++ 連結動作。
執行群組和平台執行屬性
您可以定義 exec_properties
的任意執行群組
平台目標 (與直接設為指定目標的 exec_properties
不同,
未知執行群組的 屬性會予以拒絕)。目標隨後會沿用
影響預設執行群組的 exec_properties
執行平台
和其他任何相關執行群組
舉例來說,假設執行 C++ 測試需要一些資源可用, 但不一定要編譯和連結。這可以模擬 如下:
constraint_setting(name = "resource")
constraint_value(name = "has_resource", constraint_setting = ":resource")
platform(
name = "platform_with_resource",
constraint_values = [":has_resource"],
exec_properties = {
"test.resource": "...",
},
)
cc_test(
name = "my_test",
srcs = ["my_test.cc"],
exec_compatible_with = [":has_resource"],
)
直接定義的exec_properties
優先順序高於該目標
從執行平台繼承而來