執行群組

回報問題 查看原始碼 。 。 。 。 夜間。 。 7.3 。 。 7.2 。 。 7.1 。 。 7.0 。 。 6.5

執行群組允許在單一目標中使用多個執行平台。 每個執行群組都有自己的工具鍊依附元件 自行執行工具鍊解析

背景

執行群組可讓規則作者定義動作組合,每個動作組都具備 可能不同的執行平台多個執行平台 如何執行不同動作,例如編譯遠端的 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 中 測試規則

執行群組繼承

除了定義本身的限制和工具鍊之外, 群組可以宣告要沿用規則的預設執行作業 方法是傳遞 copy_from_rule = True 參數。設定錯誤 copy_from_rule 等於 true,同時傳遞 exec_compatible_withtoolchains

繼承自預設執行群組副本的執行群組 預設的限制、工具鍊和執行屬性。這個 不僅包含您在目標層級設定的限制和執行屬性,還包括 指定規則本身所指定的值也就是說,如果考量:

# foo.bzl
my_rule = rule(
    _impl,
    exec_groups = {
        copied: exec_group(
            copy_from_rule = True,
            # This will inherit exec_compatible_with and toolchains.
            # Setting them here directly would be an error, however.
        ),
    },
    toolchains = ["//foo_tools:toolchain_type"],
    exec_compatible_with = ["@platforms//os:linux"],
)

# BUILD

my_rule(
    name = "demo",
    exec_compatible_with = [":local_constraint"],
)

已設定的目標 democopied 執行群組會包含全部 : - //fool_tools:toolchain_type - @platforms//os:linux - :local_constraint

存取執行群組

在規則實作中,您可以宣告應在 執行群組的執行平台方法是使用 exec_group 動作產生方法的參數,特別是 ctx.actions.runctx.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 群組,讓不同執行 但不需要與 規則。在這種情況下,你可以使用 copy_from_rule 建立管理群組 參數:

# foo.bzl

# Creating an exec group with `copy_from_rule=True` is the same as explicitly
# setting the exec group's toolchains and constraints to the same values as the
# rule's respective parameters.
my_rule = rule(
    _impl,
    exec_compatible_with = ["@platforms//os:linux"],
    toolchains = ["//foo:toolchain_type"],
    exec_groups = {
        # The following two groups have the same toolchains and constraints:
        foo: exec_group(copy_from_rule = True),
        "bar": exec_group(
            exec_compatible_with = ["@platforms//os:linux"],
            toolchains = ["//foo:toolchain_type"],
        ),
    },
)

#

執行群組和平台執行屬性

您可以定義 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優先順序高於該目標 從執行平台繼承而來