함수

<ph type="x-smartling-placeholder"></ph> 문제 신고 소스 보기 1박 · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

목차

패키지

package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)

이 함수는 패키지에서 찾을 수 있습니다. 패키지 (BUILD 파일) 내에서 최대 한 번 사용됩니다.

전체의 모든 규칙에 메타데이터를 적용한다고 선언하는 상대 당사자의 경우 저장소의 경우 repo() 함수를 REPO.bazel 파일을 다운로드합니다. repo() 함수는 package()와 정확히 동일한 인수를 사용합니다.

package() 함수는 파일을 찾습니다.

인수

속성 설명
default_applicable_licenses

default_package_metadata의 별칭입니다.

default_visibility

라벨 목록 기본값은 []입니다.

이 패키지에 있는 규칙의 기본 공개 상태입니다.

이 패키지의 모든 규칙은 이 속성(visibility에 달리 명시되지 않는 한) 속성 값으로 설정합니다. 이 속성에 대한 자세한 내용은 공개 상태 문서를 참고하세요. 패키지 기본 공개 상태는 다음 항목에 적용되지 않습니다. exports_files: 기본적으로 공개입니다.

default_deprecation

String; 기본값은 ""입니다.

기본값 을 설정합니다. 이 패키지의 모든 규칙에 대한 deprecation 메시지를 반환합니다.

default_package_metadata

라벨 목록 기본값은 []입니다.

패키지의 다른 모든 타겟에 적용되는 메타데이터 타겟의 기본 목록을 설정합니다. 일반적으로 OSS 패키지 및 라이선스 선언과 관련된 타겟입니다. 예를 보려면 rules_license를 참고하세요.

default_testonly

Boolean; 명시된 경우를 제외하고 기본값은 False입니다.

기본값 을 설정합니다. 이 패키지의 모든 규칙에 대한 testonly 속성입니다.

javatests 아래의 패키지에서 기본값은 True입니다.

features

목록 문자열입니다. 기본값은 []입니다.

이 BUILD 파일의 의미 체계에 영향을 미치는 다양한 플래그를 설정합니다.

이 기능은 빌드 시스템에서 작업하는 사람들이 주로 일종의 특별한 처리가 필요한 태그 패키지에 포함됩니다. 다음 경우가 아니라면 사용하지 마세요. 명시적으로 요청할 수 있습니다

아래 선언은 이 패키지의 규칙이 패키지의 멤버에게만 표시 그룹 //foo:target 개별 공개 상태 선언 이 사양을 재정의합니다.
package(default_visibility = ["//foo:target"])

package_group

package_group(name, packages, includes)

이 함수는 패키지 집합을 정의합니다. 라벨을 집합과 연결합니다. 라벨은 다음에서 참조할 수 있습니다. visibility 속성

패키지 그룹은 주로 공개 상태 제어에 사용됩니다. 공개적으로 표시되는 타겟은 소스 트리의 모든 패키지에서 참조할 수 있습니다. 비공개 visible 타겟은 하위 패키지가 아닌 자체 패키지 내에서만 참조할 수 있습니다. 이러한 극단적인 사이에서 타겟은 자체 패키지 및 패키지 중 하나 이상에 설명된 패키지 중 하나를 선택합니다. 자세한 내용은 가시성 시스템에 대한 설명은 가시성 속성

지정된 패키지는 패키지 packages 속성 또는 다른 하나에 이미 포함되어 있음 includes 속성에 언급된 패키지 그룹

패키지 그룹은 기술적으로 타겟이지만 규칙에 의해 생성되지 않으며, 자체적으로는 가시성 보호가 없습니다

인수

속성 설명
name

이름 필수

이 대상의 고유한 이름입니다.

packages

문자열 목록 기본값은 []입니다.

0개 이상의 패키지 사양 목록입니다.

각 패키지 사양 문자열은 다음 중 하나를 포함할 수 있습니다. 양식:

  1. 저장소가 없는 패키지의 전체 이름으로, 두 개의 슬래시가 있습니다. 예를 들어 //foo/bar는 패키지를 지정합니다. 패키지와 동일한 저장소에 있는 이름 그룹
  2. 위와 같지만 후행 /...가 있습니다. 예를 들어 //foo/...//foo 집합과 하위 패키지입니다. //...는 현재 저장소
  3. public 또는 private 문자열은 패키지 자체를 지정할 수도 있고 패키지를 지정하지 않을 수도 있습니다 (이 양식에는 --incompatible_package_group_has_public_syntax 플래그를 설정해야 합니다.)

또한 처음 두 종류의 패키지 사양은 - 접두사로 지정되어야 함을 나타냅니다.

패키지 그룹에는 양성 사양과 네거티브 스펙트럼이 없습니다. 예를 들어 [//foo/..., -//foo/tests/...] 값입니다. 다음 값도 나열되지 않는 //foo의 모든 하위 패키지를 포함합니다. //foo/tests의 하위 패키지입니다. (//foo 자체는 //foo/tests 자체는 포함되지 않지만 //foo/tests 자체는 포함되지 않습니다.)

공개 상태를 제외하고 공개 범위를 직접 지정할 수 있는 방법은 없습니다. 현재 저장소 외부의 패키지로 이동합니다

이 속성이 누락되면 이는 빈 목록이며, 이는 빈 목록을 포함하는 목록을 포함하는 것과도 같습니다. private만 제공됩니다.

참고: Bazel 6.0 이전에는 //... 사양이 기존 동작은 public와 동일합니다. 이 문제가 해결되는 경우 --incompatible_fix_package_group_reporoot_syntax: 사용 설정되어 있으며 이는 Bazel 6.0 이후의 기본값입니다.

참고: Bazel 6.0 이전에는 이 속성이 bazel query --output=proto의 일부 (또는 --output=xml)에서 선행 슬래시가 생략됩니다. 대상 //pkg/foo/...는 다음과 같이 출력합니다. \"pkg/foo/...\"입니다. 이 동작은 다음 경우에 수정됩니다. --incompatible_package_group_includes_double_slash: 사용 설정되어 있으며 이는 Bazel 6.0 이후의 기본값입니다.

includes

라벨 목록 기본값은 []입니다.

여기에 포함된 다른 패키지 그룹입니다.

이 속성의 라벨은 다른 패키지 그룹을 참조해야 합니다. 참조된 패키지 그룹의 패키지는 이 작업의 일부로 가져옵니다. 패키지 그룹 전이적입니다. 패키지 그룹의 경우 a에 패키지 그룹 bb이(가) 포함되어 있습니다. 패키지 그룹 c을 포함한 다음 ca의 구성원이 됩니다.

무효화된 패키지 사양과 함께 사용하는 경우 각 그룹의 패키지 세트는 먼저 독립적으로 계산되며 결과가 함께 통합됩니다. 즉, 한 그룹의 사양은 다른 그룹의 사양에 확인할 수 있습니다

다음 package_group 선언은 '열대'라는 이름의 패키지 그룹이 열매를 맺었습니다.

package_group(
    name = "tropical",
    packages = [
        "//fruits/mango",
        "//fruits/orange",
        "//fruits/papaya/...",
    ],
)

다음 선언은 가상 머신의 패키지 그룹을 애플리케이션:

package_group(
    name = "fooapp",
    includes = [
        ":controller",
        ":model",
        ":view",
    ],
)

package_group(
    name = "model",
    packages = ["//fooapp/database"],
)

package_group(
    name = "view",
    packages = [
        "//fooapp/swingui",
        "//fooapp/webui",
    ],
)

package_group(
    name = "controller",
    packages = ["//fooapp/algorithm"],
)

exports_files

exports_files([label, ...], visibility, licenses)

exports_files()는 다음에 속한 파일 목록을 지정합니다. 이 패키지는 다른 패키지로 내보내집니다.

패키지의 BUILD 파일은 파일에 속한 소스 파일만 직접 참조할 수 있음 다른 패키지로 명시적으로 내보내진 경우에는 exports_files() 문 자세히 알아보기 파일 공개 상태를 관리할 수 있습니다.

기존 동작으로 규칙에 대한 입력으로 언급된 파일도 내보냅니다. 플래그가 --incompatible_no_implicit_file_export 드림 뒤집힙니다. 그러나 이 동작을 적극적으로 신뢰해서는 안 되며, 있습니다

인수

인수는 현재 패키지에 있는 파일의 이름 목록입니다. 가 공개 상태 선언도 지정할 수 있습니다. 이 경우 파일이 표시됩니다. 공개 상태를 지정하지 않으면 패키지 기본 공개 상태가 package에 지정됨 함수를 사용하세요. 라이선스 지정할 수도 있습니다.

다음 예시에서는 golden.txt, 즉 텍스트 파일을 test_data 패키지의 패키지는 예를 들어 data 속성에서 이를 사용할 수 있습니다. 매우 유용합니다

# from //test_data/BUILD

exports_files(["golden.txt"])

glob

glob(include, exclude=[], exclude_directories=1, allow_empty=True)

Glob은 특정 경로 패턴과 일치하는 모든 파일을 찾는 도우미 함수로 그리고 변경 가능하고 정렬된 새 경로 목록을 반환합니다. Glob은 파일만 검색함 자체 패키지에서 찾고, 소스 파일만 찾고 (생성된 파일이나 있습니다.

파일의 패키지 상대적일 경우 소스 파일의 라벨이 결과에 포함됩니다. 경로가 include 패턴과 일치하고 다음 중 어느 패턴과도 일치하지 않음 exclude 패턴

includeexclude 목록에는 경로 패턴이 포함됩니다. 현재 패키지를 기준으로 합니다. 모든 패턴은 하나 이상의 더 많은 경로 세그먼트를 추가할 수 있습니다. 일반적으로 Unix 경로에서 그렇듯이 이러한 세그먼트는 / 패턴의 세그먼트는 패턴의 세그먼트와 경로 세그먼트에 * 와일드 카드가 포함될 수 있습니다. 다음과 같습니다. 경로 세그먼트의 모든 하위 문자열 (빈 하위 문자열도 포함), 디렉터리 구분 기호 /. 이 와일드 카드는 여러 번 사용할 수 있습니다. 하나의 경로 세그먼트 내에 포함될 수 있습니다 또한 ** 와일드 카드는 0개 이상의 완전한 경로 세그먼트가 필요하지만 독립형으로 선언되어야 합니다. 경로 세그먼트를 지정할 수 있습니다.

예:
  • foo/bar.txtfoo/bar.txt 파일과 정확히 일치합니다. 이 패키지에서 (foo/이 하위 패키지가 아닌 경우)
  • foo/*.txtfoo/ 디렉터리의 모든 파일과 일치합니다. 파일이 .txt로 끝나는 경우 (foo/이 하위 패키지)
  • foo/a*.htm*foo/의 모든 파일과 일치합니다. a로 시작하고 임의의 문자열( 비어 있음) .htm를 포함하고 다른 임의의 문자열로 끝남 (foo/이 하위 패키지가 아닌 경우) foo/axx.htm 등 및 foo/a.html 또는 foo/axxx.html
  • foo/*foo/ 디렉터리의 모든 파일과 일치합니다. (foo/이 하위 패키지가 아닌 경우) foo과(와) 일치하지 않습니다. exclude_directories가 0개
  • foo/**는 하위 패키지가 아닌 모든 하위 디렉터리의 모든 파일과 일치합니다. 패키지의 첫 번째 하위 디렉터리 foo/에 있습니다. 조건: exclude_directories가 0으로 설정됨, foo 디렉터리 자체도 패턴과 일치합니다. 이 경우 **는 경로 세그먼트 0개와 일치하는 것으로 간주됨
  • **/a.txt는 이 패키지에 있는 a.txt 파일과 일치합니다. 디렉터리와 하위 패키지가 아닌 하위 디렉터리를 뜻합니다.
  • **/bar/**/*.txt는 다음 간격의 모든 .txt 파일과 일치합니다. 이 패키지의 non-subpackage 하위 디렉토리. 결과 경로는 bar라고 합니다. 예를 들면 다음과 같습니다. xxx/bar/yyy/zzz/a.txt 또는 bar/a.txt( **는 또한 0개의 세그먼트와도 일치합니다.) 또는 bar/zzz/a.txt
  • **는 이 패키지
  • foo**/a.txt은(는) 잘못된 패턴입니다. ** 하나의 세그먼트로 독자적으로
  • foo/은(는) 잘못된 패턴입니다. 두 번째 세그먼트가 정의되었기 때문입니다. / 뒤의 값은 빈 문자열입니다.

exclude_directories 인수가 사용 설정 (1로 설정됨)하면 type 디렉터리는 결과에서 생략됩니다 (기본값 1).

allow_empty 인수가 False로 설정된 경우 결과가 다음과 같으면 glob 함수에서 오류가 발생합니다. 빈 목록입니다.

몇 가지 중요한 제한사항과 주의사항이 있습니다.

  1. glob()는 BUILD 파일 평가 중에 실행되므로 glob()는 소스 트리의 파일과만 일치하며 절대로 일치하지 않습니다. 생성됩니다. 두 가지 유형이 모두 필요한 소스 파일 및 생성된 파일의 경우 생성된 파일의 명시적인 목록을 파일을 glob에 업로드할 수 있습니다 예시를 참고하세요. :mylib:gen_java_srcs를 포함하는 것이 좋습니다.

  2. 규칙의 이름이 일치하는 소스 파일과 동일하면 규칙이 "그림자" 있습니다.

    이를 이해하려면 glob()가 따라서 다른 규칙에서 glob() 사용 속성 (예: srcs = glob(["*.cc"]))는 명시적으로 일치 여부를 확인합니다. 예를 들어 glob()["Foo.java", "bar/Baz.java"], 하지만 'Foo.java' 패키지 (Bazel이 경고하지만 허용됨) glob()의 소비자는 'Foo.java'를 사용합니다. 규칙 (출력)에서 'Foo.java' 대신 파일에서 참조됩니다. 자세한 내용은 GitHub 문제 #10395를 참조하세요.

  3. Glob은 하위 디렉터리의 파일과 일치할 수 있습니다. 하위 디렉터리 이름 와일드 카드를 사용할 수 있습니다. 하지만...
  4. 라벨은 패키지 경계를 넘을 수 없으며 glob은 통과합니다. 는 하위 패키지의 파일과 일치하지 않습니다.

    예를 들어 패키지의 glob 표현식 **/*.cc는 다음과 같은 경우 xx/y/z.cc이(가) 포함되지 않습니다. x/y는 패키지로 존재합니다( x/y/BUILD 또는 package-path의 다른 위치)에 저장됩니다. 이 glob 표현식의 결과가 실제로 동일한 glob 표현식이 호출된 패키지가 없는 경우 x/y/z.cc 포함 x/y 또는 --deleted_packages 플래그.

  5. 위의 제한사항은 모든 glob 표현식에 적용됩니다. 사용할 수 있습니다.
  6. 파일 이름이 .로 시작하는 숨겨진 파일이 다음과 완전히 일치하는 경우 *** 와일드 카드 모두 숨겨진 파일을 찾으려는 경우 복합 패턴이 있는 경우 패턴은 .로 시작해야 합니다. 예를 들어 *.*.txt은(는) .foo.txt과(와) 일치하지만 *.txt은(는) 일치하지 않습니다. 그렇지 않습니다. 숨겨진 디렉터리도 동일한 방식으로 일치됩니다. 숨겨진 디렉터리 입력으로 필요하지 않은 파일을 포함할 수 있으며, 메모리 소비를 줄일 수 있습니다. 제외하는 방법 '제외'에 추가하면 됩니다. list 인수를 사용합니다.
  7. '**'는 와일드 카드에는 모서리 대문자(패턴)가 하나 있습니다. "**"이(가) 패키지의 디렉터리 경로와 일치하지 않습니다. 즉 예를 들어 glob(["**"], exclude_directories = 0)는 모든 파일과 일치합니다. 및 디렉터리가 현재 패키지의 디렉터리에 전이적으로 하위에 위치 (물론 하위 패키지 디렉터리로 이동하지는 않습니다. 참고).

일반적으로 적절한 확장자 (예: *.html)를 제공해야 합니다. 대신 glob 패턴에 '*'를 사용합니다. 더 명확한 이름 자체 문서화하며 실수로 백업을 일치시키지 않도록 합니다. 파일 또는 emacs/vi/... 자동 저장 파일이 있습니다.

빌드 규칙을 작성할 때 glob의 요소를 열거할 수 있습니다. 이 예를 들어 모든 입력에 대해 개별 규칙을 생성할 수 있습니다. 자세한 내용은 확장된 glob 예 섹션을 참조하세요.

Glob의 예

이 디렉터리의 모든 자바 파일로 빌드된 Java 라이브러리를 만듭니다. 및 :gen_java_srcs 규칙으로 생성된 모든 파일

java_library(
    name = "mylib",
    srcs = glob(["*.java"]) + [":gen_java_srcs"],
    deps = "...",
)

genrule(
    name = "gen_java_srcs",
    outs = [
        "Foo.java",
        "Bar.java",
    ],
    ...
)

실험용.txt를 제외한 모든 txt 파일을 디렉터리 테스트 데이터에 포함합니다. 테스트 데이터의 하위 디렉터리에 있는 파일은 포함되지 않습니다. 만약 해당 파일을 포함하려는 경우 재귀 glob (**)을 사용합니다.

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(
        ["testdata/*.txt"],
        exclude = ["testdata/experimental.txt"],
    ),
)

재귀 Glob 예

테스트가 testdata 디렉터리의 모든 txt 파일에 종속되도록 하고 해당 하위 디렉터리 및 하위 디렉터리 등이 포함됩니다. BUILD 파일이 포함된 하위 디렉터리는 무시됩니다. (제한사항 보기 및 주의사항을 모두 참고하세요.)

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(["testdata/**/*.txt"]),
)

이 디렉터리의 모든 자바 파일과 모든 경로에 test라는 디렉터리가 포함된 하위 디렉터리가 제외됩니다. 이 패턴은 빌드 빈도를 줄일 수 있으므로 가능하면 사용하지 않는 것이 좋습니다. 빌드 시간을 늘릴 수 있습니다

java_library(
    name = "mylib",
    srcs = glob(
        ["**/*.java"],
        exclude = ["**/testing/**"],
    ),
)

확장된 Glob 예시

현재 디렉터리에 *_test.cc의 개별 genrule을 만듭니다. - 파일의 줄 수를 계산하는 함수입니다.

# Conveniently, the build language supports list comprehensions.
[genrule(
    name = "count_lines_" + f[:-3],  # strip ".cc"
    srcs = [f],
    outs = ["%s-linecount.txt" % f[:-3]],
    cmd = "wc -l $< >$@",
 ) for f in glob(["*_test.cc"])]

위의 BUILD 파일이 //foo 패키지에 있고 패키지에 세 개의 a_test.cc, b_test.cc, c_test.cc와 같은 파일을 검색하여 bazel query '//foo:all'에는 생성된 모든 규칙이 나열됩니다.

$ bazel query '//foo:all' | sort
//foo:count_lines_a_test
//foo:count_lines_b_test
//foo:count_lines_c_test
<ph type="x-smartling-placeholder"></ph>

select

select(
    {conditionA: valuesA, conditionB: valuesB, ...},
    no_match_error = "custom message"
)

select()는 규칙 속성을 만드는 도우미 함수입니다. 구성 가능합니다. 그것은 화면의 오른쪽을 거의 모든 속성 할당이 가능하므로 값이 명령줄 Bazel 플래그에 종속됩니다. 예를 들어 이를 사용하여 플랫폼별 종속 항목을 정의하거나 규칙이 '개발자'에게 구현되었는지 여부에 따라 다른 리소스 삽입 'release' 있습니다.

기본 용도는 다음과 같습니다.

sh_binary(
    name = "mytarget",
    srcs = select({
        ":conditionA": ["mytarget_a.sh"],
        ":conditionB": ["mytarget_b.sh"],
        "//conditions:default": ["mytarget_default.sh"]
    })
)

이렇게 하면 srcs 속성이 일반 라벨을 대체하여 구성 가능한 sh_binary 매핑하는 select 호출로 할당 나열 구성 조건을 일치하는 값으로 설정할 수 있습니다 각 조건은 라벨임 참조: config_setting 또는 constraint_value, '일치' 대상의 구성이 예상된 값으로 사용됩니다. 그러면 mytarget#srcs의 값이 다음 중 어느 값이든 라벨 목록이 현재 호출과 일치하는지 확인합니다.

참고:

  • 호출 시 정확히 조건이 하나만 선택됩니다.
  • 여러 조건이 일치하고 하나가 나머지 조건에 특화된 경우 전문 분야가 우선 적용됩니다 조건 B는 B에 동일한 플래그와 제약 조건이 모두 있는 경우 조건 A의 특수화 A와 몇 가지 추가 플래그 또는 제약 조건 값을 더한 값입니다. 또한 전문 분야 결정은 이는 아래 예 2에 설명되어 있습니다.
  • 여러 조건이 일치하고 하나가 모든 다른 경우에는 모든 조건이 동일한 값으로 확인되지 않으면 Bazel이 오류와 함께 실패합니다.
  • 특수 유사 라벨 //conditions:default는 다음과 같습니다. 일치하는 다른 조건이 없으면 일치로 간주됩니다. 이 조건이 생략된 경우 오류를 방지하기 위해 다른 일부 규칙이 일치해야 합니다.
  • select는 더 큰 파일 내에 삽입할 수 있음 속성 할당을 사용하면 됩니다. 따라서 srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...}) srcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})는 유효한 표현식입니다.
  • select는 일부 속성을 제외한 대부분의 속성과 함께 사용할 수 있습니다. 호환되지 않음 속성은 문서에 nonconfigurable로 표시됩니다.

    하위 패키지

    subpackages(include, exclude=[], allow_empty=True)

    subpackages()glob()와 유사한 도우미 함수입니다. 하위 패키지 목록을 표시합니다. Kubernetes는 경로 패턴을 glob()로 설정하고, 동일한 네임스페이스에 속하는 모든 하위 패키지와 현재 로드 중인 BUILD 파일의 직접 하위 요소여야 합니다. include 및 include와 관련한 자세한 설명 및 예는 glob을 참조하세요. 제외할 수 있는 패턴을 찾습니다.

    반환되는 하위 패키지의 결과로 반환되는 목록은 정렬된 순서로 표시되며 지정된 패턴과 일치하는 현재 로드 패키지의 상대 경로를 include이고 exclude의 컨트롤은 아닙니다.

    다음 예는 foo/BUILD 패키지의 모든 직접 하위 패키지를 나열합니다.

    # The following BUILD files exist:
    # foo/BUILD
    # foo/bar/baz/BUILD
    # foo/bar/but/bad/BUILD
    # foo/sub/BUILD
    # foo/sub/deeper/BUILD
    #
    # In foo/BUILD a call to
    subs1 = subpackages(include = ["**"])
    
    # results in subs1 == ["sub", "bar/baz", "bar/but/bad"]
    #
    # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of
    # 'foo'
    
    subs2 = subpackages(include = ["bar/*"])
    # results in subs2 = ["bar/baz"]
    #
    # Since 'bar' is not a subpackage itself, this looks for any subpackages under
    # all first level subdirectories of 'bar'.
    
    subs3 = subpackages(include = ["bar/**"])
    # results in subs3 = ["bar/baz", "bar/but/bad"]
    #
    # Since bar is not a subpackage itself, this looks for any subpackages which are
    # (1) under all subdirectories of 'bar' which can be at any level, (2) not a
    # subpackage of another subpackages.
    
    subs4 = subpackages(include = ["sub"])
    subs5 = subpackages(include = ["sub/*"])
    subs6 = subpackages(include = ["sub/**"])
    # results in subs4 and subs6 being ["sub"]
    # results in subs5 = [].
    #
    # In subs4, expression "sub" checks whether 'foo/sub' is a package (i.e. is a
    # subpackage of 'foo').
    # In subs5, "sub/*" looks for subpackages under directory 'foo/sub'. Since
    # 'foo/sub' is already a subpackage itself, the subdirectories will not be
    # traversed anymore.
    # In subs6, 'foo/sub' is a subpackage itself and matches pattern "sub/**", so it
    # is returned. But the subdirectories of 'foo/sub' will not be traversed
    # anymore.
    

    일반적으로 이 함수를 직접 호출하는 것보다는 사용자가 ‘하위 패키지’ 모듈의 skylib와 함께 사용할 수 있습니다.