공급업체 모드는 외부 종속 항목의 로컬 사본을 만들 수 있는 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이 최신 버전의 저장소를 가져오는 것으로 대체됩니다.