자동 실행 그룹은 각 도구 모음 유형에 대해 실행 플랫폼을 선택합니다. 즉, 하나의 타겟에 실행 그룹을 정의하지 않고도 여러 실행 플랫폼이 있을 수 있습니다.
요약
자동 실행 그룹은 도구 모음과 밀접하게 연결되어 있습니다. 도구 모음을 사용하는 경우 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
는 두 가지 도구 모음 유형을 등록합니다. 즉, Toolchain Resolution은 두 툴체인 유형을 모두 지원하는 실행 플랫폼을 찾는 데 사용되었습니다. 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
매개변수를 추가하여 각 작업이 도구 모음을 제공하는 실행 플랫폼에서 실행됩니다. 작업은 여러 실행 플랫폼에서 실행될 수 있습니다.
ctx.actions.run_shell에서도 마찬가지로 tools
이 도구 모음에서 가져온 경우 toolchain
매개변수를 추가해야 합니다.
맞춤 실행 그룹과 자동 실행 그룹의 차이점
이름에서 알 수 있듯이 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 이전
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
로 설정합니다.
존재하지 않는 도구 모음 '[toolchain_type]'에 대해 선언된 작업
- 즉, 작업에 도구 모음 매개변수를 설정했지만 규칙에 등록하지 않았습니다. 도구 모음을 등록하거나 액션 내에서
None
를 설정합니다.
추가 자료
자세한 내용은 설계 문서 툴체인의 자동 실행 그룹을 참고하세요.