외부 종속 항목 개요

문제 신고 소스 보기

Bazel은 빌드에 사용되지만 작업공간에 있지 않은 소스 파일인 외부 종속 항목인 소스 파일 (텍스트 및 바이너리 모두)을 지원합니다. 예를 들어 GitHub 저장소에 호스팅된 규칙 세트, Maven 아티팩트 또는 현재 작업공간 외부에 있는 로컬 머신의 디렉터리일 수 있습니다.

Bazel 6.0부터 저장소 중심의 기존 WORKSPACE 시스템과 새로운 모듈 중심 MODULE.bazel 시스템 (코드명이 Bzlmod이며 --enable_bzlmod 플래그가 사용 설정됨)이라는 두 가지 방법으로 Bazel을 사용하여 외부 종속 항목을 관리할 수 있습니다. 두 시스템을 함께 사용할 수 있지만 Bzlmod는 향후 Bazel 출시 버전에서 WORKSPACE 시스템을 대체하는 방법을 확인하세요. Bzl로 이전하는 방법을 참고하세요.

이 문서에서는 Bazel의 외부 종속 항목 관리를 둘러싼 개념을 설명한 후 두 시스템을 순서대로 자세히 살펴봅니다.

개념

저장소

Bazel 빌드에 사용할 소스 파일이 포함된 WORKSPACE 또는 WORKSPACE.bazel 파일이 있는 디렉터리 보통 repo로 줄여서 사용합니다.

기본 저장소

현재 Bazel 명령어가 실행되고 있는 저장소입니다.

작업공간

모든 Bazel 명령어가 공유하는 환경은 동일한 기본 저장소에서 실행됩니다.

지금까지 '저장소'와 '작업공간'의 개념은 서로 혼용되었습니다. '작업공간'이라는 용어는 종종 기본 저장소를 나타내는 데 사용되었으며 '저장소'의 동의어로도 사용되기도 합니다.

표준 저장소 이름

저장소를 지정할 수 있는 표준 이름입니다. 작업공간 컨텍스트 내에서 각 저장소에는 단일 표준 이름이 있습니다. 표준 이름이 canonical_name인 저장소 내부의 대상은 @@canonical_name//pac/kage:target 라벨로 지정할 수 있습니다 (이중 @ 참조).

기본 저장소에는 항상 표준 이름으로 빈 문자열이 있습니다.

명확한 저장소 이름

다른 특정 저장소의 컨텍스트에서 주소를 지정할 수 있는 저장소 이름입니다. 이는 저장소의 '닉네임'으로 생각할 수 있습니다. 표준 이름이 michael인 저장소는 저장소 alice의 컨텍스트에서 명확한 이름 mike을 가질 수 있지만 저장소 bob의 컨텍스트에서는 명확한 이름 mickey이 있을 수 있습니다. 이 경우 michael 내부의 타겟은 alice의 컨텍스트에서 @mike//pac/kage:target 라벨로 처리할 수 있습니다 (단일 @ 참고).

반대로 이는 저장소 매핑으로 이해될 수 있습니다. 각 저장소는 '명확한 저장소 이름'에서 '표준 저장소 이름'으로의 매핑을 유지합니다.

저장소 규칙

Bazel에 저장소를 구체화하는 방법을 알려주는 저장소 정의 스키마입니다. 예를 들어 '특정 URL에서 zip 보관 파일을 다운로드하여 추출', '특정 Maven 아티팩트를 가져와 java_import 타겟으로 제공'하거나 단순히 '로컬 디렉터리 심볼릭 링크'를 사용할 수 있습니다. 모든 저장소는 적절한 수의 인수로 저장소 규칙을 호출하여 정의됩니다.

자체 저장소 규칙을 작성하는 방법은 저장소 규칙을 참조하세요.

지금까지 가장 일반적인 저장소 규칙은 URL에서 보관 파일을 다운로드하여 추출하는 http_archive와 이미 Bazel 저장소인 로컬 디렉터리를 심볼릭 링크하는 local_repository입니다.

저장소 가져오기

연결된 저장소 규칙을 실행하여 로컬 디스크에서 저장소를 사용할 수 있게 하는 작업입니다. 작업공간에 정의된 저장소는 가져오기 전에는 로컬 디스크에서 사용할 수 없습니다.

일반적으로 Bazel은 저장소에서 무언가가 필요하고 저장소를 아직 가져오지 않은 경우에만 저장소를 가져옵니다. 이미 저장소를 가져온 경우 Bazel은 정의가 변경된 경우에만 저장소를 다시 가져옵니다.

디렉터리 레이아웃

가져온 후 저장소는 출력 베이스의 하위 디렉터리 external에서 표준 이름 아래에 있습니다.

다음 명령어를 실행하면 표준 이름이 canonical_name인 저장소의 콘텐츠를 볼 수 있습니다.

ls $(bazel info output_base)/external/ canonical_name 

Bzlmod를 사용한 외부 종속 항목 관리

새로운 외부 종속 항목 하위 시스템인 Bzlmod는 저장소 정의에서 직접 작동하지 않습니다. 대신 모듈에서 종속 항목 그래프를 빌드하고, 그래프 위에서 확장 프로그램을 실행한 후 적절히 저장소를 정의합니다.

Bazel 모듈은 여러 버전이 있을 수 있는 Bazel 프로젝트로, 각 버전은 종속된 다른 모듈에 관한 메타데이터를 게시합니다. 모듈의 저장소 루트에 WORKSPACE 파일 옆에 MODULE.bazel 파일이 있어야 합니다. 이 파일은 모듈의 이름, 버전, 종속 항목 목록 등의 정보를 선언하는 모듈의 매니페스트입니다. 다음은 기본적인 예시입니다.

module(name = "my-module", version = "1.0")

bazel_dep(name = "rules_cc", version = "0.0.1")
bazel_dep(name = "protobuf", version = "3.19.0")

모듈은 Bzlmod가 Bazel 레지스트리에서 조회하는 직접 종속 항목(기본적으로 Bazel Central Registry)만 나열해야 합니다. 레지스트리는 버전 확인을 실행하기 전에 Bazel이 전체 전이 종속 항목 그래프를 검색할 수 있는 종속 항목의 MODULE.bazel 파일을 제공합니다.

각 모듈에 대해 하나의 버전이 선택되는 버전 확인 후 Bazel은 레지스트리를 다시 참조하여 각 모듈의 저장소를 정의하는 방법을 알아봅니다(대부분의 경우 http_archive 사용).

모듈은 태그라고 하는 맞춤설정된 데이터 조각을 지정할 수도 있습니다. 태그는 모듈 결정 후 모듈 확장에서 사용하여 추가 저장소를 정의합니다. 이러한 확장 프로그램은 저장소 규칙과 유사한 기능을 가지므로 파일 I/O 및 네트워크 요청 전송과 같은 작업을 수행할 수 있습니다. 무엇보다도 Bazel이 다른 패키지 관리 시스템과 상호작용할 수 있는 동시에 Bazel 모듈을 기반으로 빌드된 종속 항목 그래프를 존중할 수 있습니다.

WORKSPACE로 저장소 정의

이전에는 WORKSPACE (또는 WORKSPACE.bazel) 파일에서 저장소를 정의하여 외부 종속 항목을 관리할 수 있었습니다. 이 파일은 BUILD 파일과 유사한 문법을 가지고 있으며, 빌드 규칙 대신 repo 규칙을 사용합니다.

다음 스니펫은 WORKSPACE 파일에서 http_archive 저장소 규칙을 사용하는 예시입니다.

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

스니펫은 표준 이름이 foo인 저장소를 정의합니다. WORKSPACE 시스템에서 기본적으로 저장소의 표준 이름은 다른 모든 저장소의 명확한 이름이기도 합니다.

WORKSPACE 시스템의 단점

WORKSPACE 시스템이 도입된 이후 몇 년 동안 사용자들은 다음과 같은 수많은 문제점을 보고했습니다.

  • Bazel은 종속 항목의 WORKSPACE 파일을 평가하지 않으므로 모든 전이 종속 항목은 직접 종속 항목 외에 기본 저장소의 WORKSPACE 파일에서 정의해야 합니다.
  • 이 문제를 해결하기 위해 프로젝트는 'deps.bzl' 패턴을 채택했습니다. 이 패턴에서는 차례로 여러 저장소를 정의하는 매크로를 정의하고 사용자에게 WORKSPACE 파일에서 이 매크로를 호출하도록 요청합니다.
    • 여기에는 자체 문제가 있습니다. 매크로는 다른 .bzl 파일을 load할 수 없으므로 이러한 프로젝트는 이 'deps' 매크로에 전이 종속 항목을 정의하거나 사용자가 여러 계층의 'deps' 매크로를 호출하도록 하여 이 문제를 해결해야 합니다.
    • Bazel은 WORKSPACE 파일을 순차적으로 평가합니다. 또한 종속 항목은 버전 정보 없이 URL과 함께 http_archive를 사용하여 지정됩니다. 즉, 다이아몬드 종속 항목의 경우 버전 확인을 실행할 수 있는 안정적인 방법이 없습니다 (ABC에 종속되고 BC는 모두 다른 D 버전에 종속됨).

WORKSPACE의 단점으로 인해 Bzlmod는 향후 Bazel 출시에서 기존 WORKSPACE 시스템을 대체할 예정입니다. Bzlmod로 이전하는 방법은 Bzlmod 이전 가이드를 참고하세요.