외부 종속 항목에 대한 고급 주제

문제 신고 소스 보기 Nightly · 8.0 . 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

WORKSPACE에서 종속 항목 섀도잉

가능하면 프로젝트에 단일 버전 정책을 적용하세요. 이는 컴파일하고 최종 바이너리로 끝나는 종속 항목에 필요합니다. 다른 경우에는 종속 항목을 섀도잉할 수 있습니다.

myproject/WORKSPACE

workspace(name = "myproject")

local_repository(
    name = "A",
    path = "../A",
)
local_repository(
    name = "B",
    path = "../B",
)

A/WORKSPACE

workspace(name = "A")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "...",
)

B/WORKSPACE

workspace(name = "B")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)

종속 항목 AB 모두 서로 다른 버전의 testrunner에 종속됩니다. myproject/WORKSPACE에서 고유한 이름을 지정하여 충돌 없이 myproject에 둘 다 포함합니다.

workspace(name = "myproject")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner-v1",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "..."
)
http_archive(
    name = "testrunner-v2",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)
local_repository(
    name = "A",
    path = "../A",
    repo_mapping = {"@testrunner" : "@testrunner-v1"}
)
local_repository(
    name = "B",
    path = "../B",
    repo_mapping = {"@testrunner" : "@testrunner-v2"}
)

이 메커니즘을 사용하여 다이아몬드를 조인할 수도 있습니다. 예를 들어 AB에 동일한 종속 항목이 있지만 다른 이름으로 호출하는 경우 myproject/WORKSPACE에서 이러한 종속 항목을 결합합니다.

명령줄에서 저장소 재정의

명령줄에서 선언된 저장소를 로컬 저장소로 재정의하려면 --override_repository 플래그를 사용합니다. 이 플래그를 사용하면 소스 코드를 변경하지 않고도 외부 저장소의 콘텐츠를 변경할 수 있습니다.

예를 들어 @foo를 로컬 디렉터리 /path/to/local/foo로 재정의하려면 --override_repository=foo=/path/to/local/foo 플래그를 전달합니다.

사용 사례는 다음과 같습니다.

  • 문제 디버깅 예를 들어 http_archive 저장소를 더 쉽게 변경할 수 있는 로컬 디렉터리로 재정의할 수 있습니다.
  • 공급업체 네트워크 호출을 할 수 없는 환경에 있는 경우 네트워크 기반 저장소 규칙을 재정의하여 대신 로컬 디렉터리를 가리킵니다.

프록시 사용

Bazel은 HTTPS_PROXYHTTP_PROXY 환경 변수에서 프록시 주소를 가져와 이를 사용하여 HTTPHTTPS 파일 (지정된 경우)을 다운로드합니다.

IPv6 지원

IPv6 전용 머신에서는 Bazel이 변경사항 없이 종속 항목을 다운로드할 수 있습니다. 그러나 이중 스택 IPv4/IPv6 머신에서는 Bazel이 Java와 동일한 규칙을 따르며 사용 설정된 경우 IPv4를 선호합니다. IPv4 네트워크가 외부 주소를 확인하거나 연결할 수 없는 경우와 같이 경우에 따라 Network unreachable 예외와 빌드 실패가 발생할 수 있습니다. 이 경우 java.net.preferIPv6Addresses=true 시스템 속성을 사용하여 IPv6를 선호하도록 Bazel의 동작을 재정의할 수 있습니다. 특히 다음에 주의해야 합니다.

  • --host_jvm_args=-Djava.net.preferIPv6Addresses=true 시작 옵션을 사용합니다. 예를 들어 .bazelrc 파일에 다음 줄을 추가합니다.

    startup --host_jvm_args=-Djava.net.preferIPv6Addresses=true

  • 인터넷에 연결해야 하는 Java 빌드 타겟 (예: 통합 테스트)을 실행할 때는 --jvmopt=-Djava.net.preferIPv6Addresses=true 도구 플래그를 사용하세요. 예를 들어 .bazelrc 파일에 다음을 포함합니다.

    build --jvmopt=-Djava.net.preferIPv6Addresses

  • 종속 항목 버전 확인에 rules_jvm_external를 사용하는 경우 COURSIER_OPTS 환경 변수에 -Djava.net.preferIPv6Addresses=true도 추가하여 Coursier에 JVM 옵션을 제공합니다.

오프라인 빌드

비행기에서 이동하는 경우와 같이 오프라인에서 빌드를 실행하고 싶을 때가 있습니다. 이러한 간단한 사용 사례의 경우 bazel fetch 또는 bazel sync를 사용하여 필요한 저장소를 미리 가져옵니다. 빌드 중에 추가 저장소 가져오기를 사용 중지하려면 --nofetch 옵션을 사용합니다.

다른 항목에서 필요한 모든 파일을 제공하는 실제 오프라인 빌드의 경우 Bazel은 --distdir 옵션을 지원합니다. 이 플래그는 저장소 규칙에서 Bazel에게 ctx.download 또는 ctx.download_and_extract를 사용하여 파일을 가져오라고 요청할 때 Bazel이 해당 옵션으로 지정된 디렉터리를 먼저 살펴보도록 지시합니다. 필요한 파일의 해시 합계를 제공하면 Bazel은 첫 번째 URL의 기본 이름과 일치하는 파일을 찾고 해시가 일치하면 로컬 사본을 사용합니다.

Bazel 자체는 이 기법을 사용하여 배포 아티팩트에서 오프라인으로 부트스트랩합니다. 내부 distdir_tar에서 필요한 모든 외부 종속 항목을 수집하여 이를 실행합니다.

Bazel은 네트워크를 호출하는지 여부를 알지 못해도 저장소 규칙에서 임의의 명령어를 실행할 수 있으므로 완전히 오프라인 빌드를 시행할 수 없습니다. 빌드가 오프라인에서 제대로 작동하는지 테스트하려면 Bazel의 부트스트랩 테스트에서와 같이 네트워크를 수동으로 차단합니다.