Bazel은
저장소라고 하는 디렉터리 트리에 정리된 소스 코드에서 소프트웨어를 빌드합니다. 정의된 저장소 집합은 작업공간을 구성합니다. 저장소의 소스
파일은 패키지의 중첩된 계층 구조로 정리됩니다. 여기서
각 패키지는 관련 소스 파일 집합과 하나의
BUILD 파일이 포함된 디렉터리입니다. BUILD 파일은 소스에서 빌드할 수 있는 소프트웨어 출력을 지정합니다.
저장소
Bazel 빌드에 사용되는 소스 파일은 저장소 (종종
repos로 줄여서 사용)에 정리됩니다. 저장소는 루트에 경계 마커 파일이 있는 디렉터리 트리입니다. 이러한 경계 마커 파일은 MODULE.bazel, REPO.bazel 또는
기존 컨텍스트에서 WORKSPACE 또는 WORKSPACE.bazel일 수 있습니다.
현재 Bazel 명령어가 실행 중인 저장소를 기본 저장소 라고 합니다. 다른 (외부) 저장소는 저장소 규칙에 의해 정의됩니다. 자세한 내용은 외부 종속 항목 개요를 참고하세요.
작업공간
A 작업공간은 동일한 기본 저장소에서 실행되는 모든 Bazel 명령어에서 공유하는 환경입니다. 기본 저장소와 정의된 모든 외부 저장소 집합을 포함합니다.
역사적으로 '저장소'와 '작업공간'의 개념이 혼동되어 왔습니다. '작업공간'이라는 용어는 기본 저장소를 지칭하는 데 자주 사용되었으며 때로는 '저장소'의 동의어로 사용되기도 했습니다.
패키지
저장소에서 코드 구성의 기본 단위는 패키지 입니다. 패키지는 관련 파일 모음과 출력 아티팩트를 생성하는 데 사용할 수 있는 방법을 지정합니다.
패키지는
BUILD 파일이 포함된 디렉터리로 정의되며, 파일 이름은 BUILD 또는 BUILD.bazel입니다. 패키지에는 디렉터리의 모든 파일과 그 아래의 모든 하위 디렉터리가 포함됩니다.
단, BUILD 파일이 포함된 파일은 제외됩니다. 이 정의에 따라 파일 또는 디렉터리는 두 개의 다른 패키지의 일부가 될 수 없습니다.
예를 들어 다음 디렉터리 트리에는 my/app라는 패키지와
my/app/tests라는 하위 패키지가 있습니다. my/app/data는 패키지가 아니라
my/app 패키지에 속한 디렉터리입니다.
src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc
대상
패키지는 패키지의
BUILD 파일에 정의된 대상의 컨테이너입니다. 대부분의 대상은 두 가지 주요 종류인 파일과 규칙 중 하나입니다.
파일은 두 가지 종류로 더 세분화됩니다. 소스 파일은 일반적으로 사람의 노력으로 작성되고 저장소에 체크인됩니다. 생성된 파일, 파생 파일 또는 출력 파일이라고도 하는 체크인되지 않지만 소스 파일에서 생성됩니다.
두 번째 종류의 대상은 규칙으로 선언됩니다. 각 규칙 인스턴스 는 입력 파일 집합과 출력 파일 집합 간의 관계를 지정합니다. 규칙의 입력은 소스 파일일 수 있지만 다른 규칙의 출력일 수도 있습니다.
규칙의 입력이 소스 파일인지 생성된 파일인지는 대부분의 경우 중요하지 않습니다. 중요한 것은 해당 파일의 콘텐츠뿐입니다. 이러한 사실 로 인해 복잡한 소스 파일을 규칙에서 생성된 파일로 쉽게 대체할 수 있습니다. 예를 들어 고도로 구조화된 파일을 수동으로 유지하는 부담이 너무 지루해지고 누군가가 이를 파생시키는 프로그램을 작성하는 경우입니다. 해당 파일의 소비자를 변경할 필요가 없습니다. 반대로 생성된 파일은 로컬 변경사항만으로 소스 파일로 쉽게 대체될 수 있습니다.
규칙의 입력에는 다른 규칙 도 포함될 수 있습니다. 이러한 관계의 정확한 의미는 종종 매우 복잡하고 언어 또는 규칙에 따라 다르지만 직관적으로는 간단합니다. C++ 라이브러리 규칙 A에는 입력으로 다른 C++ 라이브러리 규칙 B가 있을 수 있습니다. 이 종속 항목의 효과는 컴파일 중에 B의 헤더 파일을 A에서 사용할 수 있고, 연결 중에 B의 기호를 A에서 사용할 수 있으며, 실행 중에 B의 런타임 데이터를 A에서 사용할 수 있다는 것입니다.
모든 규칙의 불변성은 규칙에서 생성된 파일이 항상 규칙 자체와 동일한 패키지에 속한다는 것입니다. 파일을 다른 패키지에 생성할 수는 없습니다. 규칙의 입력이 다른 패키지에서 오는 것은 드문 일이 아닙니다.
패키지 그룹은 특정 규칙의 접근성을 제한하는 것을 목적으로 하는 패키지 집합입니다. 패키지 그룹은 package_group 함수로 정의됩니다. 패키지 그룹에는 포함된 패키지 목록, 이름, 포함된 다른
패키지 그룹의 세 가지 속성이 있습니다. 패키지 그룹을 참조하는 유일하게 허용되는 방법은 규칙의
visibility 속성 또는 default_visibility 속성에서
package 함수의 속성에서 참조하는 것입니다. 패키지 그룹은 파일을 생성하거나 소비하지 않습니다. 자세한 내용은 package_group
문서를 참고하세요.