저장소 규칙

이 페이지에서는 저장소 규칙을 만드는 방법을 다루며 예를 들어 자세한 내용을 제공합니다.

외부 저장소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_repositorynew_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 아티팩트에 대한 빌드 대상을 생성합니다.