공급업체 모드

<ph type="x-smartling-placeholder"></ph> 문제 신고 소스 보기 1박 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

공급업체 모드는 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~

둘 다 rules_cc가 벤더링되도록 <workspace root>/vendor_src/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 저장소는 vendor 디렉터리에 있습니다
  • 사용자는 bazel_skylib의 벤더링된 소스를 안전하게 수정할 수 있습니다.
  • bazel_skylib를 다시 벤더하려면 사용자가 PIN 명세서를 사용 중지해야 합니다. 있습니다.
를 통해 개인정보처리방침을 정의할 수 있습니다.

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

Bazel은 $(bazel info output_base)/external 아래에서 프로젝트의 외부 종속 항목을 가져옵니다. 외부 종속 항목 벤더링은 관련 파일과 디렉터리를 지정된 공급업체 디렉터리로 보내고 최신 빌드를 위한 벤더링된 소스

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

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

빌드 중에 벤더링된 마커 파일이 최신이거나 저장소가 VENDOR.bazel 파일에 고정된 경우 Bazel은 심볼릭 링크를 사용하려면 $(bazel info output_base)/external 아래에 실행할 수 있습니다 그렇지 않으면 경고가 출력되고 Bazel이 최신 버전의 저장소를 가져오는 것으로 대체됩니다.

공급업체 레지스트리 파일

Bazel은 외부 IP 주소를 가져오기 위해 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 출력 베이스로 이동한 후 변경할 수 있습니다.