라벨

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.
문제 신고 출처 보기

모든 대상은 정확히 하나의 패키지에 속합니다. 대상의 이름은 라벨이라고 합니다. 모든 라벨은 대상을 고유하게 식별합니다. 표준 형식의 일반적인 라벨은 다음과 같습니다.

@myrepo//my/app/main:app_binary

라벨의 첫 번째 부분은 저장소 이름 @myrepo//입니다. 라벨이 사용된 일반적인 저장소를 나타내는 일반적인 경우 저장소 식별자는 //로 축약될 수 있습니다. 따라서 @myrepo 라벨은 일반적으로 다음과 같이 작성됩니다.

//my/app/main:app_binary

라벨의 두 번째 부분은 정규화되지 않은 패키지 이름 my/app/main로, 저장소 루트를 기준으로 한 패키지의 경로입니다. 저장소 이름과 정규화되지 않은 패키지 이름은 정규화된 패키지 이름 @myrepo//my/app/main을 구성합니다. 라벨이 사용되는 것과 동일한 패키지를 참조하는 경우 패키지 이름 (및 선택적으로 콜론)을 생략할 수 있습니다. 따라서 @myrepo//my/app/main 내에서 이 라벨은 다음 중 하나로 작성될 수 있습니다.

app_binary
:app_binary

규칙에는 파일의 콜론이 생략되지만 규칙에 대해서는 유지되지만 그 외의 경우에는 중요하지 않습니다.

콜론 뒤에 있는 라벨 부분인 app_binary은 정규화되지 않은 대상 이름입니다. 패키지 경로의 마지막 구성요소와 일치하면 구성요소와 콜론을 생략할 수 있습니다. 따라서 두 라벨은 동일합니다.

//my/app/lib
//my/app/lib:lib

패키지의 하위 디렉터리에 있는 파일 타겟의 이름은 패키지 루트 (BUILD 파일이 포함된 디렉터리)를 기준으로 한 파일 경로입니다. 따라서 이 파일은 저장소의 my/app/main/testdata 하위 디렉터리에 있습니다.

//my/app/main:testdata/input.txt

//my/app@some_repo//my/app 같은 문자열은 사용되는 컨텍스트에 따라 두 가지 의미가 있습니다. Bazel이 라벨을 예상할 때 각각 //my/app:app@some_repo//my/app:app을 의미합니다. 그러나 Bazel은 패키지가 기대되면 (예: package_group 사양) 해당 라벨이 포함된 패키지를 참조합니다.

BUILD 파일에서 흔히 발생하는 실수는 //my/app를 사용하여 패키지를 참조하거나 패키지의 모든 대상을 참조하는 것입니다. 그렇지 않습니다. //my/app:app과 동일하므로 현재 저장소의 my/app 패키지에 app 타겟 이름을 지정합니다.

그러나 //my/app을 사용하여 패키지를 참조하는 것은 package_group 또는 .bzl 파일을 지정하는 데 사용하는 것이 좋습니다. 패키지 이름이 절대적이며 작업공간의 최상위 디렉터리에 뿌리를 두고 있음을 명확하게 전달하기 때문입니다.

다른 패키지의 대상을 참조하는 데 상대적 라벨을 사용할 수 없습니다. 이 경우 저장소 식별자와 패키지 이름을 항상 지정해야 합니다. 예를 들어 소스 트리에 my/app 패키지와 my/app/testdata 패키지가 모두 포함되어 있는 경우 (이 두 디렉터리에는 각각 자체 BUILD 파일이 있음) 후자의 패키지에 testdepot.zip라는 파일이 포함되어 있습니다. 다음은 //my/app:BUILD 내에서 이 파일을 참조하는 두 가지 방법입니다 (하나는 틀림, 하나는 정확함).

잘못됨testdata은 다른 패키지이므로 상대 경로를 사용할 수 없습니다.

testdata/testdepot.zip

올바른 방법 - 전체 경로를 포함하여 testdata 참조

//my/app/testdata:testdepot.zip

@//으로 시작하는 라벨은 기본 저장소의 참조로, 외부 저장소에서도 계속 작동합니다. 따라서 @//a/b/c는 외부 저장소에서 참조될 때 //a/b/c와 다릅니다. 전자는 기본 저장소를 다시 참조하고 후자는 외부 저장소 자체에서 //a/b/c을 찾습니다. 이는 기본 저장소에서 기본 저장소의 대상을 참조하는 규칙을 작성할 때 특히 관련성이 높으며 외부 저장소에서 사용됩니다.

대상을 참조할 수 있는 다양한 방법에 대한 자세한 내용은 대상 패턴을 참조하세요.

라벨의 어휘 사양

라벨 구문은 셸에 특별한 의미가 있는 메타 문자를 사용하지 않는 것이 좋습니다. 이렇게 하면 실수로 따옴표를 사용하는 문제를 방지하고 Bazel 쿼리 언어와 같이 라벨을 조작하는 도구와 스크립트를 더 쉽게 구성할 수 있습니다.

허용되는 대상 이름의 정확한 세부정보는 다음과 같습니다.

대상 이름 — package-name:target-name

target-name은 패키지 내의 타겟 이름입니다. 규칙 이름은 BUILD 파일에 있는 규칙 선언의 name 속성 값입니다. 파일 이름은 BUILD 파일을 포함하는 디렉터리를 기준으로 한 경로 이름입니다.

대상 이름은 a~z, A~Z, 0~9 집합과 구두점 !%-@^_"#$&'()*-+,;<=>?[]{|}~/. 기호로 만든 문자로만 구성되어야 합니다.

파일 이름은 일반적인 형식의 상대 경로 이름이어야 합니다. 즉, 슬래시로 시작하거나 끝나지 않아야 하며 (예: /foofoo/은 금지됨) 경로 구분자(예: foo//bar)로 연속된 슬래시를 여러 개 포함해야 합니다. 마찬가지로 상위 수준 참조 (..)와 현재 디렉터리 참조 (./)는 금지됩니다.

잘못된 방법 — 다른 패키지의 파일을 참조할 때 `..` 를 사용하지 마세요.

올바른 예 - `//package-name:filename` 사용

파일 대상 이름에 /를 사용하는 것이 일반적이지만 규칙 이름에 /을 사용하지 않는 것이 좋습니다. 특히 축약형 라벨을 사용하면 독자가 혼동할 수 있습니다. //foo/bar/wiz 라벨은 이러한 패키지가 foo/bar/wiz이 없더라도 항상 //foo/bar/wiz:wiz의 약식입니다. 타겟이 존재하는 경우에도 //foo:bar/wiz를 참조하지 않습니다.

하지만 슬래시 사용이 편리하거나 경우에 따라 필요한 경우도 있습니다. 예를 들어 특정 규칙의 이름은 패키지의 하위 디렉터리에 있을 수 있는 주 소스 파일과 일치해야 합니다.

패키지 이름 — //package-name:target-name

패키지 이름은 포함하는 저장소의 최상위 디렉터리를 기준으로 BUILD 파일이 포함된 디렉터리의 이름입니다. 예를 들면 my/app입니다.

패키지 이름은 A-Z, a~z, 0~9, '/', '-', '.', '@', '_' 집합에서 가져온 문자로 구성되어야 하며 슬래시로 시작할 수 없습니다.

모듈 시스템에 중요한 디렉터리 구조 (예: 자바)가 있는 언어의 경우 언어에서 유효한 식별자인 디렉터리 이름을 선택하는 것이 중요합니다.

Bazel이 작업공간의 루트 패키지 (예: //:foo)에 대상을 지원하지만 모든 의미 있는 패키지에 설명이 포함된 이름을 사용하도록 이 패키지를 비워두는 것이 가장 좋습니다.

패키지 이름은 // 하위 문자열을 포함하거나 슬래시로 끝날 수 없습니다.

규칙

규칙은 입력과 출력 간의 관계와 출력 빌드 단계를 지정합니다. 규칙은 빌드 백과사전에 설명된 대로 컴파일된 실행 파일 및 라이브러리, 테스트 실행 파일 및 기타 지원되는 출력을 생성하는 여러 종류의 종류 중 하나일 수 있습니다 (규칙 클래스라고도 함).

BUILD 파일은 규칙을 호출하여 대상을 선언합니다.

아래 예시에서는 cc_binary 규칙을 사용하여 대상 my_app의 선언을 확인할 수 있습니다.

cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    deps = [
        "//absl/base",
        "//absl/strings",
    ],
)

모든 규칙 호출에는 BUILD 파일의 패키지 내에서 대상을 선언하는 name 속성 (유효한 대상 이름이어야 함)이 있습니다.

모든 규칙에는 일련의 속성이 있으며, 특정 규칙의 관련 속성 및 각 속성의 중요도와 의미 체계는 규칙의 종류에 따른 함수입니다. 규칙 목록과 해당 속성은 빌드 백과사전을 참조하세요. 각 속성에는 이름과 유형이 있습니다. 속성에 포함될 수 있는 일반적인 유형으로는 정수, 라벨, 라벨 목록, 문자열, 문자열 목록, 출력 라벨, 출력 라벨 목록이 있습니다. 모든 규칙에 모든 속성을 지정할 필요는 없습니다. 따라서 속성은 키 (이름)에서 유형이 지정된 선택적 값으로 사전을 구성합니다.

많은 규칙에 있는 srcs 속성의 유형은 '라벨 목록'이며, 값(있는 경우)은 라벨 목록이며 각각은 이 규칙의 입력인 타겟 이름입니다.

경우에 따라 규칙 종류가 다소 임의적일 수 있으며, 규칙에서 생성되는 파일의 이름이 더 흥미로울 수 있으며 이는 genrule도 마찬가지입니다. 자세한 내용은 일반 규칙: genrule을 참조하세요.

그 외의 경우 이름이 중요합니다. 예를 들어 *_binary*_test 규칙의 경우 규칙 이름에 따라 빌드에서 생성된 실행 파일의 이름이 결정됩니다.

대상 위에 이러한 방향성 비순환 그래프를 대상 그래프 또는 빌드 종속 항목 그래프라고 하며, Bazel 쿼리 도구가 작동하는 도메인입니다.

대상 파일 빌드