자동 실행 그룹 (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',
    )

이 규칙은 두 개의 작업, 즉 First action에서 실행 파일을 사용하는 작업을 만듭니다. //tools:toolchain_type_1Second action//tools:toolchain_type_2입니다. AEG 이전에는 이러한 작업이 모두 두 툴체인 유형을 모두 지원하는 단일 실행 플랫폼에서 실행됩니다. AEG를 사용하면 toolchain 매개변수를 작업 내에 추가하면 각 작업이 다음에서 실행됩니다. 툴체인을 제공하는 실행 플랫폼입니다 작업은 실행할 수 있습니다

이는 toolchainctx.actions.run_shell에도 적용됩니다. 매개변수는 tools가 도구 모음에서 가져온 경우 추가되어야 합니다.

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

이름에서 알 수 있듯이 AEG는 각 팀원에 대해 자동으로 생성되는 규칙에 등록된 도구 모음 유형입니다. 직접 지정할 필요가 없습니다. 기존의 '클래식' 실행할 수 있습니다

커스텀 exec_group은 언제 사용해야 하나요?

커스텀 exec_groups는 여러 도구 모음이 단일 실행 플랫폼에서 실행됩니다 다른 모든 경우에는 커스텀 exec_groups를 정의합니다. 예를 들면 다음과 같습니다.

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 이전

Blaze는 이미 google3 내부에서 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로 설정하면 (플래그의 GitHub 문제) 또는 특정 규칙을 사용 중지하세요. _use_auto_exec_groups 속성을 False로 설정 (속성에 대한 자세한 내용)

AEG로 마이그레이션 시 발생하는 오류 메시지

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

  • 이 경우 오류가 발생하기 전에 호출 스택을 가져와 도구 모음 매개변수가 필요한 정확한 작업을 명확하게 확인할 수 있습니다. 확인할 항목 도구 모음이 작업에 사용되고 도구 모음 매개변수로 설정합니다. 답이 '아니요'인 경우 툴체인이 도구 또는 실행 파일에 대한 작업 내에서 사용되는 경우 None

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

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

추가 자료

자세한 내용은 설계 문서를 확인하세요. 도구 모음의 자동 실행 그룹.