자동 실행 그룹 (AEG)

자동 실행 그룹은 각 도구 모음 유형의 실행 플랫폼을 선택합니다. 즉, 실행 그룹을 정의하지 않고도 한 대상에 여러 실행 플랫폼이 있을 수 있습니다.

요약

자동 실행 그룹은 도구 모음과 밀접하게 연결되어 있습니다. 도구 모음을 사용하는 경우 toolchain 매개변수를 추가하여 영향을 받는 작업 (실행 파일 또는 도구 모음의 도구를 사용하는 작업)에 도구 모음을 설정해야 합니다. 예:

ctx.actions.run(
    ...,
    executable = ctx.toolchain['@bazel_tools//tools/jdk:toolchain_type'].tool,
    ...,
    toolchain = '@bazel_tools//tools/jdk:toolchain_type',
)

작업이 도구 모음의 도구나 실행 파일을 사용하지 않고 Blaze가 이를 감지하지 못하면 (오류 발생) toolchain = None를 설정할 수 있습니다.

단일 실행 플랫폼에서 여러 도구 모음을 사용해야 하는 경우 (작업에서 두 개 이상의 도구 모음에 있는 실행 파일 또는 도구를 사용함) exec_groups를 수동으로 정의해야 합니다 (언제 커스텀 exec_group을 사용해야 하나요? 섹션 확인).

기록

AEG 이전에는 규칙 수준에서 실행 플랫폼이 선택되었습니다. 예를 들면 다음과 같습니다.

my_rule = rule(
    _impl,
    toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
)

my_rule 규칙은 두 개의 도구 모음 유형을 등록합니다. 즉, 두 도구 모음 유형을 모두 지원하는 실행 플랫폼을 찾는 데 사용되는 도구 모음 해결입니다. exec_groups에 다르게 지정되지 않는 한 선택한 실행 플랫폼이 규칙 내 등록된 각 작업에 사용되었습니다. 즉, 규칙 내의 모든 작업은 서로 다른 도구 모음의 도구를 사용하더라도 단일 실행 플랫폼을 보유했습니다 (각 대상에 실행 플랫폼이 선택됨). 그 결과 모든 도구 모음을 지원하는 실행 플랫폼이 없으면 오류가 발생했습니다.

현재 상태

AEG를 사용하면 각 도구 모음 유형에 대해 실행 플랫폼이 선택됩니다. 앞선 예의 my_rule 구현 함수는 다음과 같습니다.

def _impl(ctx):
    ctx.actions.run(
      mnemonic = "First action",
      executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
      toolchain = '//tools:toolchain_type_1',
    )

    ctx.actions.run(
      mnemonic = "Second action",
      executable = ctx.toolchain['//tools:toolchain_type_2'].tool,
      toolchain = '//tools:toolchain_type_2',
    )

이 규칙은 두 가지 작업을 만듭니다. 하나는 //tools:toolchain_type_1의 실행 파일을 사용하는 First action이고, 다른 하나는 //tools:toolchain_type_2의 실행 파일을 사용하는 Second action입니다. AEG 이전에는 이러한 두 작업이 두 도구 모음 유형을 모두 지원하는 단일 실행 플랫폼에서 실행되었습니다. AEG를 사용하면 작업 내에 toolchain 매개변수를 추가하여 각 작업이 도구 모음을 제공하는 실행 플랫폼에서 실행됩니다. 작업은 서로 다른 실행 플랫폼에서 실행될 수 있습니다.

이는 tools가 도구 모음에서 가져온 것일 때 toolchain 매개변수를 추가해야 하는 ctx.actions.run_shell에서도 마찬가지입니다.

커스텀 실행 그룹과 자동 실행 그룹의 차이점

이름에서 알 수 있듯이 AEG는 규칙에 등록된 각 도구 모음 유형에 관해 자동으로 생성되는 실행 그룹입니다. '기본' 실행 그룹과 달리 수동으로 지정할 필요가 없습니다.

맞춤 exec_group은 언제 사용해야 하나요?

커스텀 exec_group은 여러 도구 모음을 단일 실행 플랫폼에서 실행해야 하는 경우에만 필요합니다. 다른 모든 경우에는 맞춤 exec_group을 정의할 필요가 없습니다. 예를 들면 다음과 같습니다.

def _impl(ctx):
    ctx.actions.run(
      ...,
      executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
      tools = [ctx.toolchain['//tools:toolchain_type_2'].tool],
      exec_group = 'two_toolchains',
    )
my_rule = rule(
    _impl,
    exec_groups = {
        "two_toolchains": exec_group(
            toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
        ),
    }
)

AEG 이전

google3 내부에서 Blaze는 이미 AEG를 사용하고 있습니다. Bazel의 경우 외부적으로 마이그레이션이 진행 중입니다. 일부 규칙 (예: Java 및 C++ 규칙)에서는 이미 이 기능을 사용하고 있습니다.

어떤 Bazel 버전이 이 마이그레이션을 지원하나요?

AEG는 Bazel 7에서 완전히 지원됩니다.

AEG를 사용 설정하는 방법

--incompatible_auto_exec_groups를 true로 설정합니다. 플래그에 대한 자세한 내용은 GitHub 문제를 참조하세요.

특정 규칙 내에서 AEG를 사용 설정하려면 어떻게 해야 하나요?

규칙에 _use_auto_exec_groups 속성을 설정합니다.

my_rule = rule(
    _impl,
    attrs = {
      "_use_auto_exec_groups": attr.bool(default = True),
    }
)

이렇게 하면 my_rule에서만 AEG가 사용 설정되고 실행 플랫폼을 선택할 때 작업이 새 로직을 사용하기 시작합니다. 호환되지 않는 플래그는 이 속성으로 재정의됩니다.

오류 발생 시 AEG를 사용 중지하는 방법

--incompatible_auto_exec_groups를 false로 설정하여 프로젝트에서 AEG를 완전히 사용 중지하거나 (플래그의 GitHub 문제) _use_auto_exec_groups 속성을 False로 설정하여 특정 규칙을 사용 중지합니다(속성에 관한 자세한 내용).

AEG로 이전하는 중 오류 메시지

도구가 암시적 종속 항목의 것인지 아니면 도구 모음에서 비롯되는지 식별할 수 없습니다. 도구 모음 매개변수를 설정하세요. 도구 모음을 사용하지 않는 경우에는 'None'으로 설정하세요.

  • 이 경우 오류가 발생하기 전에 호출 스택을 얻고 도구 모음 매개변수가 필요한 정확한 작업을 명확하게 확인할 수 있습니다. 작업에 사용되는 도구 모음을 확인하고 도구 모음 매개변수로 설정하세요. 도구 또는 실행 파일의 작업 내에 도구 모음이 사용되지 않으면 None로 설정합니다.

존재하지 않는 도구 모음 '[toolchain_type]'에 대해 선언된 작업입니다.

  • 즉, 작업에 도구 모음 매개변수를 설정했지만 규칙에 등록하지 않았습니다. 도구 모음을 등록하거나 작업 내에서 None를 설정합니다.

추가 자료

자세한 내용은 설계 문서 도구 모음용 자동 실행 그룹을 참조하세요.