공급업체 모드는 외부 종속 항목의 로컬 사본을 만들 수 있는 기능입니다. 오프라인 빌드 또는 외부 종속 항목의 소스를 제어하려는 경우에 유용합니다.
공급업체 모드 사용 설정
--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를 다시 공급업체로 지정하려면 사용자가 먼저 고정 문 을 사용 중지해야 합니다.
localconfigure
공급업체 모드의 작동 방식 이해
Bazel은 $(bazel info
output_base)/external 아래에서 프로젝트의 외부 종속 항목을 가져옵니다. 외부 종속 항목을 공급업체로 지정한다는 것은 관련 파일과 디렉터리를 지정된 공급업체 디렉터리로 이동하고 나중에 빌드할 때 공급업체로 지정된 소스를 사용하는 것을 의미합니다.
공급업체로 지정되는 콘텐츠는 다음과 같습니다.
- 저장소 디렉터리
- 저장소 마커 파일
빌드 중에 공급업체로 지정된 마커 파일이 최신 상태이거나 저장소가
VENDOR.bazel 파일에 고정되어 있으면 Bazel은 저장소 규칙을 실제로 실행하는 대신
$(bazel info output_base)/external 아래에 심볼릭 링크를 만들어 공급업체로 지정된 소스를 사용합니다. 그렇지 않으면 경고가 출력되고 Bazel은
저장소의 최신 버전을 가져오는 것으로 대체됩니다.
공급업체 레지스트리 파일
Bazel은 외부
종속 항목을 가져오기 위해 Bazel 모듈 해결을 실행해야 하며, 이로 인해 인터넷을 통해 레지스트리 파일에 액세스해야 할 수 있습니다. 오프라인 빌드를 달성하기 위해 Bazel은 <vendor_dir>/_registries 디렉터리 아래의
네트워크에서 가져온 모든 레지스트리 파일을 공급업체로 지정합니다.
공급업체 심볼릭 링크
외부 저장소에는 다른 파일 또는 디렉터리를 가리키는 심볼릭 링크가 포함될 수 있습니다. 심볼릭 링크가 올바르게 작동하도록 Bazel은 다음 전략을 사용하여 공급업체로 지정된 소스의 심볼릭 링크를 다시 작성합니다.
$(bazel info output_base)/external을 가리키는 심볼릭 링크<vendor_dir>/bazel-external을 만듭니다. 모든 Bazel 명령어에 의해 자동으로 새로고침됩니다.- 공급업체로 지정된 소스의 경우 원래
$(bazel info output_base)/external아래의 경로를 가리키는 모든 심볼릭 링크를<vendor_dir>/bazel-external아래의 상대 경로로 다시 작성합니다.
예를 들어 원래 심볼릭 링크가
<vendor_dir>/repo_foo+/link => $(bazel info output_base)/external/repo_bar+/file
다음과 같이 다시 작성됩니다.
<vendor_dir>/repo_foo+/link => ../../bazel-external/repo_bar+/file
어디서
<vendor_dir>/bazel-external => $(bazel info output_base)/external # This might be new if output base is changed
<vendor_dir>/bazel-external은 Bazel에 의해 자동으로 생성되므로 체크인하지 않도록 .gitignore 또는 이와 동등한 항목에 추가하는 것이 좋습니다.
이 전략을 사용하면 공급업체로 지정된 소스가 다른 위치로 이동하거나 bazel 출력 기본 이 변경된 후에도 공급업체로 지정된 소스의 심볼릭 링크가 올바르게 작동합니다.