공급업체 모드

공급업체 모드는 외부 종속 항목의 로컬 사본을 만들 수 있는 Bzlmod의 기능입니다. 이는 오프라인 빌드 시 또는 외부 종속 항목의 소스를 제어하려는 경우에 유용합니다.

공급업체 모드 사용 설정

--vendor_dir 플래그를 지정하여 공급업체 모드를 사용 설정할 수 있습니다.

예를 들어 .bazelrc 파일에 추가하면 다음과 같습니다.

# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src

공급업체 디렉터리는 작업공간 루트의 상대 경로이거나 절대 경로일 수 있습니다.

특정 외부 저장소 공급업체

vendor 명령어를 --repo 플래그와 함께 사용하여 공급업체에 지정할 저장소를 지정할 수 있습니다. 이 경우 표준 저장소 이름명확한 저장소 이름을 모두 허용합니다.

예를 들어 다음을 실행합니다.

bazel vendor --vendor_dir=vendor_src --repo=@rules_cc

사용하여

bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc~

둘 다 <workspace root>/vendor_src/rules_cc~에 따라 벤더링되도록 rules_cc를 가져옵니다.

지정된 타겟의 공급업체 외부 종속 항목

지정된 타겟 패턴을 빌드하는 데 필요한 모든 외부 종속 항목을 공급업체에 제공하려면 bazel vendor <target patterns>를 실행하면 됩니다.

예:

bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...

현재 구성으로 //src/main:hello-world 타겟과 //src/test/... 아래의 모든 타겟을 빌드하는 데 필요한 모든 저장소를 공급합니다.

내부적으로는 bazel build --nobuild 명령어를 실행하여 타겟 패턴을 분석하므로 빌드 플래그가 이 명령어에 적용되어 결과에 영향을 미칠 수 있습니다.

오프라인으로 대상 빌드

외부 종속 항목이 벤더링되면 다음을 통해 타겟을 오프라인으로 빌드할 수 있습니다.

bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...

빌드는 네트워크 액세스 및 저장소 캐시가 없는 클린 빌드 환경에서 작동해야 합니다.

따라서 벤더링된 소스를 체크인하고 다른 머신에 오프라인으로 동일한 대상을 빌드할 수 있어야 합니다.

공급업체의 모든 외부 종속 항목

전이 외부 종속 항목 그래프에서 모든 저장소를 벤더링하려면 다음을 실행합니다.

bazel vendor --vendor_dir=vendor_src

모든 종속 항목을 벤더링하면 몇 가지 단점이 있습니다.

  • 전이적으로 도입된 저장소를 포함하여 모든 저장소를 가져오려면 시간이 오래 걸릴 수 있습니다.
  • 공급업체 디렉터리는 매우 커질 수 있습니다.
  • 현재 플랫폼이나 환경과 호환되지 않는 저장소는 가져오지 못할 수 있습니다.

따라서 먼저 특정 타겟에 대한 벤더링을 고려하세요.

VENDOR.bazel을 사용하여 공급업체 모드 구성

공급업체 디렉터리에 있는 VENDOR.bazel 파일을 사용하여 특정 저장소 처리 방법을 제어할 수 있습니다.

두 개의 지시어를 사용할 수 있으며, 둘 다 표준 저장소 이름 목록을 인수로 허용합니다.

  • ignore(): 공급업체 모드에서 저장소를 완전히 무시합니다.
  • pin(): 이 저장소에 관한 --override_repository 플래그가 있는 것처럼 현재 벤더링된 소스에 저장소를 고정합니다. Bazel은 공급업체 명령어가 고정 해제되지 않는 한 이 저장소를 실행하는 동안 이 저장소의 벤더링된 소스를 업데이트하지 않습니다. 사용자는 이 저장소의 벤더링된 소스를 수동으로 수정하고 유지관리할 수 있습니다.

예:

ignore("@@rules_cc~")
pin("@@bazel_skylib~")

이 구성 사용

  • 두 저장소 모두 후속 공급업체 명령어에서 제외됩니다.
  • 저장소 bazel_skylib는 공급업체 디렉터리 아래에 있는 소스로 재정의됩니다.
  • 사용자는 bazel_skylib의 벤더링된 소스를 안전하게 수정할 수 있습니다.
  • bazel_skylib를 다시 공급업체로 제공하려면 사용자는 먼저 PIN 명세서를 사용 중지해야 합니다.

공급업체 모드의 작동 방식 이해

Bazel은 $(bazel info output_base)/external 아래에서 프로젝트의 외부 종속 항목을 가져옵니다. 외부 종속 항목을 벤더링한다는 것은 관련 파일과 디렉터리를 지정된 공급업체 디렉터리로 이동하고 이후 빌드에 벤더링된 소스를 사용하는 것을 의미합니다.

벤더링되는 콘텐츠는 다음과 같습니다.

  • 저장소 디렉터리
  • 저장소 마커 파일

빌드 중에 벤더링된 마커 파일이 최신 상태이거나 저장소가 VENDOR.bazel 파일에 고정되어 있는 경우 Bazel은 실제로 저장소 규칙을 실행하는 대신 $(bazel info output_base)/external 아래에 심볼릭 링크를 생성하여 벤더링된 소스를 사용합니다. 그러지 않으면 경고가 출력되고 Bazel이 최신 버전의 저장소를 가져오는 것으로 대체됩니다.