이 페이지에서는 저장소 규칙을 만드는 방법을 설명하고 자세한 예를 제공합니다.
외부 저장소는 WORKSPACE
파일에서만 사용할 수 있는 규칙이며 Bazel의 로드 단계에서 기본 제공 이외의 작업을 사용 설정합니다. 각 외부 저장소 규칙은 자체 BUILD
파일 및 아티팩트가 있는 자체 작업공간을 만듭니다. 또한 Maven 패키지 라이브러리와 같은 서드 파티 라이브러리에 종속되는 데 사용할 수 있을 뿐만 아니라 Bazel이 실행되는 호스트와 관련된 BUILD
파일을 생성하기 위해서도 사용할 수 있습니다.
저장소 규칙 생성
.bzl
파일에서 repository_rule 함수를 사용하여 새 저장소 규칙을 만들고 전역 변수에 이를 저장합니다.
맞춤 저장소 규칙은 네이티브 저장소 규칙처럼 사용할 수 있습니다. 필수 name
속성이 있으며 빌드 파일에 있는 모든 타겟은 @<name>//package:target
로 참조할 수 있습니다. 여기서 <name>
는 name
속성의 값입니다.
이 규칙은 명시적으로 빌드할 때 또는 빌드의 종속 항목일 때 로드됩니다. 이 경우 Bazel은 implementation
함수를 실행합니다. 이 함수는 저장소와 저장소 콘텐츠, BUILD
파일을 만드는 방법을 설명합니다.
특성
속성은 url
또는 sha256
와 같은 규칙 인수입니다. 저장소 규칙을 정의할 때 속성과 속성의 유형을 나열해야 합니다.
local_repository = repository_rule(
implementation=_impl,
local=True,
attrs={"path": attr.string(mandatory=True)})
속성에 액세스하려면 repository_ctx.attr.<attribute_name>
를 사용합니다.
모든 repository_rule
에는 빌드 규칙과 마찬가지로 암시적으로 정의된 속성이 있습니다. 두 가지 암시적 속성은 name
(빌드 규칙과 같음) 및 repo_mapping
입니다. 저장소 규칙의 이름은 repository_ctx.name
를 사용하여 액세스할 수 있습니다. repo_mapping
의 의미는 네이티브 저장소 규칙 local_repository
및 new_local_repository
의 의미와 동일합니다.
속성 이름이 _
로 시작하면 비공개이며 사용자가 설정할 수 없습니다.
구현 함수
모든 저장소 규칙에는 implementation
함수가 필요합니다. 규칙의 실제 로직을 포함하며 로드 단계에서만 실행됩니다.
이 함수에는 정확히 하나의 입력 매개변수인 repository_ctx
가 있습니다. 이 함수는 지정된 매개변수가 주어진 규칙을 재현할 수 있음을 나타내기 위해 None
를 반환하거나, 해당 규칙을 동일한 저장소를 생성하는 재현 가능한 규칙으로 바꾸는 매개변수 집합이 포함된 dict를 반환합니다. 예를 들어 Git 저장소를 추적하는 규칙의 경우 원래 지정된 플로팅 브랜치 대신 특정 커밋 식별자를 반환합니다.
입력 매개변수 repository_ctx
는 속성 값과 밀폐되지 않은 함수 (바이너리 찾기, 바이너리 실행, 저장소에서 파일 만들기, 인터넷에서 파일 다운로드)에 액세스하는 데 사용할 수 있습니다. 자세한 내용은 라이브러리를 참고하세요. 예:
def _impl(repository_ctx):
repository_ctx.symlink(repository_ctx.attr.path, "")
local_repository = repository_rule(
implementation=_impl,
...)
구현 함수는 언제 실행되나요?
저장소가 local
로 선언된 경우 종속 항목 그래프 (WORKSPACE
파일 자체 포함)에서 종속 항목이 변경되면 구현 함수가 실행됩니다.
구현 함수는 요청한 종속 항목이 누락되면 다시 시작될 수 있습니다. 구현 함수의 시작은 종속 항목이 해결된 후에 다시 실행됩니다. 네트워크 액세스를 반복해야 할 수 있어 비용이 많이 드는 불필요한 다시 시작을 방지하기 위해 모든 라벨 인수를 기존 파일로 확인할 수 있는 경우 라벨 인수를 미리 가져옵니다. 함수 실행 중에만 구성된 문자열 또는 라벨의 경로를 확인하는 경우에도 여전히 다시 시작될 수 있습니다.
마지막으로 local
가 아닌 저장소의 경우 다음 종속 항목의 변경만으로도 다시 시작될 수 있습니다.
- 저장소 규칙을 정의하는 데 필요한
.bzl
파일 WORKSPACE
파일의 저장소 규칙 선언repository_rule
함수의environ
속성으로 선언된 모든 환경 변수의 값입니다. 이러한 환경 변수의 값은 명령줄에서--action_env
플래그를 사용하여 적용할 수 있습니다 (하지만 이 플래그는 빌드의 모든 작업을 무효화합니다).- 라벨에 의해 사용 및 참조되는 파일의 콘텐츠 (예:
mypkg/label.txt
가 아닌//mypkg:label.txt
).
외부 저장소 다시 가져오기 강제
경우에 따라 정의 또는 종속 항목을 변경하지 않고도 외부 저장소가 오래될 수 있습니다. 예를 들어 소스를 가져오는 저장소는 서드 파티 저장소의 특정 브랜치를 따를 수 있으며, 이 브랜치에서 새 커밋을 사용할 수 있습니다. 이 경우 bazel sync
를 호출하여 무조건적으로 모든 외부 저장소를 다시 가져오도록 bazel에 요청할 수 있습니다.
또한 일부 규칙은 로컬 머신을 검사하므로 로컬 머신이 업그레이드되면 오래된 규칙이 될 수 있습니다. 여기서 bazel에 repository_rule
정의에 configure
속성이 설정되어 있는 외부 저장소만 다시 가져오도록 요청할 수 있습니다(bazel sync --configure
사용).
예
C++ 자동 구성 도구 모음: 저장소 규칙을 사용하여 로컬 C++ 컴파일러, 환경, C++ 컴파일러에서 지원하는 플래그를 찾아 Bazel용 C++ 구성 파일을 자동으로 만듭니다.
Go 저장소는 여러
repository_rule
를 사용하여 Go 규칙을 사용하는 데 필요한 종속 항목 목록을 정의합니다.rules_jvm_external은 기본적으로
@maven
라는 외부 저장소를 만듭니다. 이 저장소는 전이 종속 항목 트리에서 모든 Maven 아티팩트의 빌드 대상을 생성합니다.