이 페이지에서는 저장소 규칙을 만드는 방법을 다루며 예를 들어 자세한 내용을 제공합니다.
외부 저장소는 WORKSPACE
파일에서만 사용할 수 있는 규칙으로 Bazel의 로드 단계에서 기본 제공되지 않는 작업을 사용 설정합니다. 각 외부 저장소 규칙은 자체 BUILD
파일 및 아티팩트가 있는 자체 작업공간을 만듭니다. Dockerfile은 타사 라이브러리 (예: 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
함수가 필요합니다. 이것은 규칙의 실제 논리를 포함하고 있으며 로드 단계에서 엄격하게 실행됩니다.
이 함수에는 정확히 1개의 입력 매개변수 repository_ctx
이 있습니다. 이 함수는 None
을 반환하여 지정된 매개변수가 있을 때 규칙을 재현할 수 있음을 나타내거나, 같은 규칙을 재현할 수 있는 규칙으로 바꾸는 규칙의 매개변수 집합이 있는 딕셔너리를 나타냅니다. 예를 들어 원래 지정된 플로팅 브랜치 대신 특정 커밋 식별자를 반환하는 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에 bazel sync
를 호출하여 무조건 모든 외부 저장소를 무조건 다시 가져오도록 요청할 수 있습니다.
또한 일부 규칙은 로컬 머신을 검사하며 로컬 머신이 업그레이드되면 만료될 수 있습니다. 여기서 bazel에 repository_rule
정의에 configure
속성이 설정된 외부 저장소만 다시 가져오도록 요청할 수 있습니다. bazel sync --configure
를 사용하세요.
예
C++ 자동 구성된 도구 모음: 저장소 규칙을 사용하여 로컬 C++ 컴파일러, 환경, C++ 컴파일러에서 지원하는 플래그를 찾아 Bazel용 C++ 구성 파일을 자동으로 만듭니다.
Go 저장소는 여러
repository_rule
를 사용하여 Go 규칙을 사용하는 데 필요한 종속 항목 목록을 정의합니다.rules_jvm_external은 기본적으로
@maven
라는 외부 저장소를 만듭니다. 이 전이 종속 항목 트리의 모든 Maven 아티팩트에 대한 빌드 대상을 생성합니다.