자동 실행 그룹은 각 도구 모음 유형의 실행 플랫폼을 선택합니다. 즉, 실행 그룹을 정의하지 않고도 한 대상에 여러 실행 플랫폼이 있을 수 있습니다.
요약
자동 실행 그룹은 도구 모음과 밀접하게 연결되어 있습니다. 도구 모음을 사용하는 경우 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
를 설정합니다.
추가 자료
자세한 내용은 설계 문서 도구 모음용 자동 실행 그룹을 참조하세요.