이전 섹션에서는 패키지, 타겟, 라벨, 빌드 종속성 그래프를 추상적으로 설명했습니다. 이 섹션에서는 패키지를 정의하는 데 사용되는 구체적인 구문을 설명합니다.
정의에 따라 모든 패키지에는 짧은 프로그램인 BUILD
파일이 포함됩니다.
BUILD
파일은 명령형 언어인 Starlark를 사용하여 평가됩니다.
이는 명령문의 순차적 목록으로 해석됩니다.
일반적으로 순서가 중요합니다. 예를 들어 변수는 사용되기 전에 정의되어야 합니다. 하지만 대부분의 BUILD
파일은 빌드 규칙 선언으로만 구성되며 이러한 문의 상대적 순서는 중요하지 않습니다. 패키지 평가가 완료될 때까지 어떤 규칙이 어떤 값으로 선언되었는지만 중요합니다.
cc_library
과 같은 빌드 규칙 함수가 실행되면 그래프에 새 타겟이 생성됩니다. 이 타겟은 나중에 라벨을 사용하여 참조할 수 있습니다.
간단한 BUILD
파일에서는 동작을 변경하지 않고도 규칙 선언의 순서를 자유롭게 바꿀 수 있습니다.
코드와 데이터 간의 명확한 분리를 장려하기 위해 BUILD
파일에는 함수 정의, for
문 또는 if
문이 포함될 수 없습니다 (하지만 목록 내포 및 if
표현식은 허용됨). 함수는 대신 .bzl
파일에서 선언할 수 있습니다. 또한 *args
및 **kwargs
인수는 BUILD
파일에서 허용되지 않습니다. 대신 모든 인수를 명시적으로 나열하세요.
중요한 점은 Starlark의 프로그램이 임의의 I/O를 실행할 수 없다는 것입니다. 이 불변식은 BUILD
파일의 해석을 hermetic하게 만듭니다. 즉, 알려진 입력 세트에만 종속되므로 빌드가 재현 가능하도록 하는 데 필수적입니다.
자세한 내용은 Hermeticity를 참고하세요.
BUILD
파일은 기본 코드의 종속 항목이 변경될 때마다 업데이트해야 하므로 일반적으로 팀의 여러 사용자가 유지관리합니다. BUILD
파일 작성자는 각 빌드 타겟의 역할(공용으로 사용할지 여부)을 문서화하고 패키지 자체의 역할을 문서화하기 위해 자유롭게 주석을 달아야 합니다.
확장 프로그램 로드
Bazel 확장 프로그램은 .bzl
로 끝나는 파일입니다. load
문을 사용하여 확장 프로그램에서 심볼을 가져옵니다.
load("//foo/bar:file.bzl", "some_library")
이 코드는 foo/bar/file.bzl
파일을 로드하고 some_library
기호를 환경에 추가합니다. 이를 사용하여 새 규칙, 함수 또는 상수(예: 문자열 또는 목록)를 로드할 수 있습니다. load
호출에 추가 인수를 사용하여 여러 기호를 가져올 수 있습니다. 인수는 문자열 리터럴(변수 없음)이어야 하며 load
문은 최상위 수준에 표시되어야 합니다. 함수 본문에는 있을 수 없습니다.
load
의 첫 번째 인수는 .bzl
파일을 식별하는 라벨입니다. 상대 라벨인 경우 현재 bzl
파일을 포함하는 패키지 (디렉터리 아님)를 기준으로 확인됩니다. load
문의 상대 라벨은 선행 :
를 사용해야 합니다.
load
는 별칭도 지원하므로 가져온 기호에 다른 이름을 할당할 수 있습니다.
load("//foo/bar:file.bzl", library_alias = "some_library")
하나의 load
문 내에 여러 별칭을 정의할 수 있습니다. 또한 인수 목록에는 별칭과 일반 심볼 이름이 모두 포함될 수 있습니다. 다음 예는 완전히 합법적입니다 (따옴표를 사용하는 시점에 유의하세요).
load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")
.bzl
파일에서 _
로 시작하는 심볼은 내보내지 않으며 다른 파일에서 로드할 수 없습니다.
가시성 로드를 사용하여 .bzl
파일을 로드할 수 있는 사용자를 제한할 수 있습니다.
빌드 규칙 유형
대부분의 빌드 규칙은 언어별로 그룹화된 계열로 제공됩니다. 예를 들어 cc_binary
, cc_library
, cc_test
는 각각 C++ 바이너리, 라이브러리, 테스트의 빌드 규칙입니다. 다른 언어에서는 동일한 명명 체계를 사용하며, Java의 경우 java_*
와 같이 접두사가 다릅니다. 이러한 함수 중 일부는 빌드 백과사전에 문서화되어 있지만 누구나 새 규칙을 만들 수 있습니다.
*_binary
규칙은 지정된 언어로 실행 가능한 프로그램을 빌드합니다. 빌드 후 실행 파일은 규칙 라벨의 해당 이름으로 빌드 도구의 바이너리 출력 트리에 상주하므로//my:program
은 (예를 들어)$(BINDIR)/my/program
에 표시됩니다.일부 언어에서는 이러한 규칙이 규칙에 속한
data
속성 또는 종속 항목의 전이적 클로저에 있는 규칙에 언급된 모든 파일이 포함된 runfiles 디렉터리도 만듭니다. 이 파일 집합은 프로덕션에 쉽게 배포할 수 있도록 한곳에 모입니다.*_test
규칙은 자동 테스트에 사용되는*_binary
규칙의 전문화입니다. 테스트는 성공 시 0을 반환하는 프로그램입니다.바이너리와 마찬가지로 테스트에도 runfile 트리가 있으며 그 아래의 파일은 테스트가 런타임에 합법적으로 열 수 있는 유일한 파일입니다. 예를 들어 프로그램
cc_test(name='x', data=['//foo:bar'])
가 실행 중에$TEST_SRCDIR/workspace/foo/bar
를 열고 읽을 수 있습니다. (각 프로그래밍 언어에는$TEST_SRCDIR
값에 액세스하기 위한 자체 유틸리티 함수가 있지만 모두 환경 변수를 직접 사용하는 것과 동일합니다.) 이 규칙을 준수하지 않으면 원격 테스트 호스트에서 실행될 때 테스트가 실패합니다.*_library
규칙은 지정된 프로그래밍 언어로 별도로 컴파일된 모듈을 지정합니다. 라이브러리는 다른 라이브러리에 종속될 수 있고 바이너리와 테스트는 라이브러리에 종속될 수 있으며 예상되는 별도 컴파일 동작이 있습니다.
라벨 | 종속 항목 |
파일 인코딩
BUILD
및 .bzl
파일은 UTF-8로 인코딩되어야 하며, 여기서 ASCII는 유효한 하위 집합입니다. 현재는 임의의 바이트 시퀀스가 허용되지만 향후 지원이 중단될 수 있습니다.