자동 실행 그룹은 각 도구 모음 유형의 실행 플랫폼 을 선택합니다. 즉, 하나의 대상에 실행 그룹을 정의하지 않고도 여러 실행 플랫폼이 있을 수 있습니다.
요약
자동 실행 그룹은 도구 모음과 밀접하게 연결되어 있습니다. 도구 모음을 사용하는 경우 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_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 매개변수를 추가하여 각 작업이 도구 모음을 제공하는 실행 플랫폼에서 실행됩니다. 작업은 서로 다른 실행 플랫폼에서 실행될 수 있습니다.
ctx.actions.run_shell에서도 마찬가지입니다. 여기서 toolchain
매개변수는 tools가 도구 모음의 도구인 경우 추가해야 합니다.
맞춤 exec 그룹과 자동 exec 그룹의 차이점
이름에서 알 수 있듯이 AEG는 규칙에 등록된 각 도구 모음 유형에 대해 자동으로 생성되는 exec 그룹입니다. '클래식' exec 그룹과 달리 수동으로 지정할 필요가 없습니다. 또한 AEG의 이름은 도구 모음 유형 (//tools:toolchain_type_1 등)으로 자동 설정됩니다.
맞춤 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'으로 설정하세요.
- 이 경우 오류가 발생하기 전에 호출 스택이 표시되며 도구 모음 매개변수가 필요한 정확한 작업을 명확하게 확인할 수 있습니다. 작업에 사용되는 도구 모음을 확인하고 도구 모음 매개변수로 설정합니다. 도구 또는 실행 파일의 작업 내에서 도구 모음이 사용되지 않는 경우
None으로 설정합니다.
존재하지 않는 도구 모음('[toolchain_type]')에 대해 선언된 작업입니다.
- 즉, 작업에서 도구 모음 매개변수를 설정했지만 규칙에 등록하지 않았습니다. 도구 모음을 등록하거나 작업 내에서
None을 설정합니다.
추가 자료
자세한 내용은 설계 문서인 도구 모음의 자동 exec 그룹을 참고하세요.