Bazel 쿼리 참조

문제 신고 소스 보기 1박 · 7.2 · 7.1 · 7.0 · 6.5 · 6.4

이 페이지는 사용된 Bazel 쿼리 언어의 참조 매뉴얼입니다. bazel query를 사용하여 빌드 종속 항목을 분석하는 경우 또한 bazel query에서 지원하는 출력 형식을 설명합니다.

실제 사용 사례는 Bazel 쿼리 방법을 참조하세요.

추가 쿼리 참조

로드 후 단계 타겟 그래프에서 실행되는 query 외에도 Bazel에는 작업 그래프 쿼리구성 가능한 쿼리가 포함되어 있습니다.

작업 그래프 쿼리

작업 그래프 쿼리 (aquery)는 분석 후 구성된 리소스에서 작동합니다. 타겟 그래프는 작업, 아티팩트, 살펴봤습니다 aquery는 다음에 관심이 있을 때 유용합니다. 구성된 타겟 그래프에서 생성된 액션/아티팩트의 속성. 예를 들어 실제 명령어 실행과 입력, 출력, 니모닉이 있습니다.

자세한 내용은 쿼리 참조를 확인하세요.

구성 가능한 쿼리

기존 Bazel 쿼리는 로드 후 단계 대상 그래프에서 실행되며 따라서 구성 및 관련 개념의 개념이 없습니다. 특히, select 문을 올바르게 확인하지 못합니다. 대신 선택의 가능한 모든 해상도를 반환합니다. 그러나 구성 가능한 쿼리 환경인 cquery가 구성을 적절히 처리하지만 는 원래 검색어의 모든 기능을 제공하지 않습니다.

자세한 내용은 cquery 참조를 확인하세요.

bazel query을(를) 사용하는 방법 다음은 일반적인 예입니다.

//foo 트리가 //bar/baz에 종속되는 이유는 무엇인가요? 경로 표시:

somepath(foo/..., //bar/baz:all)

C++ 라이브러리가 실행하는 모든 foo 테스트는 foo_bin 타겟이 아닌가요?

kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo:foo_bin))

토큰: 어휘 구문

쿼리 언어의 표현식은 다음으로 구성됩니다. 토큰:

  • 키워드(예: let). 키워드는 아래에 각각 설명되어 있습니다. 전체 세트 기준:

  • 단어(예: 'foo/...') 또는 '.*test rule' 또는 '//bar/baz:all' 만약 문자 시퀀스가 '따옴표로 묶여 있음'인 경우 (시작 및 끝부분에 작은따옴표 ' 또는 단어입니다. 문자 시퀀스가 따옴표로 묶여 있지 않아도 단어로 파싱될 수 있습니다. 따옴표로 묶이지 않은 단어는 연속적인 시퀀스입니다. 알파벳 문자 A-Za-z, 숫자 0-9, 특수 문자 */@.-_:$~[] (별표, 슬래시, at, 마침표, 하이픈, 밑줄, 콜론, 달러 기호, 물결표, 왼쪽 대괄호, 오른쪽 사각형 중괄호). 하지만 따옴표가 없는 단어는 하이픈 - 또는 별표 *로 시작할 수 없습니다. 상대적인 타겟 이름이 볼 수 있습니다.

    또한 따옴표로 묶이지 않은 단어에는 + 또는 같음 기호를 포함할 수 없습니다. = 부호를 포함해야 합니다. 날짜 작성하는 경우 대상 이름은 따옴표로 묶어야 합니다.

    Bazel 쿼리를 구성하는 스크립트를 작성할 때는 따옴표가 필요합니다. 표현식을 사용할 수 있습니다.

     //foo:bar+wiz    # WRONG: scanned as //foo:bar + wiz.
     //foo:bar=wiz    # WRONG: scanned as //foo:bar = wiz.
     "//foo:bar+wiz"  # OK.
     "//foo:bar=wiz"  # OK.
    

    이 인용문은 예를 들면 다음과 같습니다.

    bazel query ' "//foo:bar=wiz" '   # single-quotes for shell, double-quotes for Bazel.
    

    키워드와 연산자는 따옴표로 묶으면 일반 단어로 취급됩니다. 예를 들어 some는 'some'인 키워드 단어입니다. foo 및 'foo' 모두 단어입니다.

    그러나 타겟 이름에 작은따옴표나 큰따옴표를 사용할 때는 주의해야 합니다. 날짜 여러 개의 타겟 이름을 인용할 때는 한 가지 유형의 따옴표만 사용하세요. 작은따옴표 모두 또는 작은따옴표)를 사용할 수 있습니다.

    다음은 Java 쿼리 문자열의 예시입니다.

      'a"'a'         # WRONG: Error message: unclosed quotation.
      "a'"a"         # WRONG: Error message: unclosed quotation.
      '"a" + 'a''    # WRONG: Error message: unexpected token 'a' after query expression '"a" + '
      "'a' + "a""    # WRONG: Error message: unexpected token 'a' after query expression ''a' + '
      "a'a"          # OK.
      'a"a'          # OK.
      '"a" + "a"'    # OK
      "'a' + 'a'"    # OK
    

    이 구문을 선택한 이유는 대부분의 경우 따옴표가 필요하지 않기 때문입니다. 이 (일반적이지 않은) ".*test rule" 예는 따옴표가 필요합니다. 마침표로 시작하고 에는 공백이 포함됩니다. "cc_library" 인용은 불필요하지만 무해합니다.

  • 구두점(예: 괄호 (), 마침표 ., 쉼표 ,). 단어 포함된 문장 부호 (위에 나열된 예외 제외)는 따옴표로 묶어야 합니다.

따옴표로 묶인 단어 이외의 공백 문자는 무시됩니다.

Bazel 쿼리 언어 개념

Bazel 쿼리 언어는 표현식 언어입니다. 반복 주기 표현식은 부분적으로 정렬된 타겟 집합으로 평가됩니다. 또는 이에 상응하는 타겟 그래프 (DAG)입니다. 이는 데이터 유형입니다.

집합과 그래프는 동일한 데이터 유형을 참조하지만 다른 점을 강조 예를 들면 다음과 같습니다.

  • 설정: 타겟의 부분 순서는 관심이 없습니다.
  • 그래프: 타겟의 부분 순서가 중요합니다.

종속 항목 그래프의 주기

빌드 종속 항목 그래프는 비순환적이어야 합니다.

쿼리 언어에서 사용하는 알고리즘은 비순환 그래프이지만 주기에는 강합니다. 자세히 알아보려면 지정되지 않으므로 신뢰해서는 안 됩니다.

암시적 종속 항목

BUILD 파일에 명시적으로 정의된 종속 항목을 빌드하는 것 외에도 다음을 실행합니다. Bazel은 규칙에 암시적 종속 항목을 추가합니다. 예: 모든 Java 규칙은 JavaBuilder에 암시적으로 종속됩니다. 암시적 종속 항목 $로 시작하는 속성을 사용하여 설정되며 BUILD 파일에서 재정의할 수 없습니다.

기본적으로 bazel query는 암시적 종속 항목을 고려합니다. 할 수 있습니다. 이 동작은 --[no]implicit_deps 옵션 검색어는 잠재적인 도구 모음은 고려되지 않습니다.

건전성

Bazel 쿼리 언어 표현식은 빌드에서 작동합니다. 종속 항목 그래프: 모든 종속 항목이 암시적으로 정의한 그래프 규칙 선언을 BUILD 파일에 포함시킵니다. 중요한 점은 이 그래프는 다소 추상적이고 실제 상황을 빌드의 모든 단계를 수행하는 방법에 대한 자세한 설명 포함 빌드를 수행하려면 구성도 필요합니다. 자세한 내용은 구성을 섹션을 참조하세요.

Bazel 쿼리 언어로 표현식을 평가한 결과 모든 구성에 대해 true입니다. 즉, 과대근접한 보수적인 근사치이며 정확히 정확하지는 않습니다. 만약 쿼리 도구를 사용하여 필요한 모든 소스 파일 세트 계산 실제로 필요한 것보다 더 많이 보고할 수 있습니다. 왜냐하면 쿼리 도구는 검색어에 포함된 메일 번역을 지원하는 데 필요한 빌드에서 이 기능을 사용할 수 있습니다.

그래프 순서 보존에 관해

작업은 순서를 유지함 하위 표현식에서 상속된 제약 조건을 사용할 수도 있습니다. Kubernetes가 이것을 '부분 질서 보존 법칙'이라고 합니다. 가상 머신을 예: 종속 항목인 경우, 결과 세트는 종속 항목 그래프에 따라 다릅니다. 이 값을 동일하게 file 종류의 타겟만 포함 모든 사이의 전이적 부분 정렬 관계 유지 결과 하위 집합에 대상 쌍이 있습니다. 이 쌍은 실제로 원래 그래프에서 직접 연결되어 있습니다. 빌드 종속 항목 그래프에 파일-파일 에지가 없습니다.

그러나 모든 연산자가 순서를 보존하지만 일부 연산자는 set 작업과 같은 자체적인 순서 제약조건을 도입해서는 안 됩니다. 다음 표현식을 살펴보겠습니다.

deps(x) union y

최종 결과 집합의 순서는 즉, 하위 표현식의 정렬 제약 조건인 x의 전이 종속 항목은 다음으로 올바르게 정렬됩니다. 서로 존중할 수 있습니다 그러나 쿼리는 y의 타겟 순서 또는 deps(x)의 타겟 순서를 y( deps(x)에도 있는 y).

순서 제약 조건을 도입하는 연산자는 다음과 같습니다. allpaths, deps, rdeps, somepath, 대상 패턴 와일드 카드 package:*, dir/...

스카이 쿼리

스카이 쿼리는 지정된 유니버스 범위에서 작동하는 쿼리 모드입니다.

SkyQuery에서만 사용할 수 있는 특수 함수

스카이 쿼리 모드에는 allrdepsrbuildfiles입니다. 이러한 기능은 전체 범위 (일반 쿼리에는 적합하지 않음)입니다.

유니버스 범위 지정

다음 두 플래그를 전달하면 스카이 쿼리 모드가 활성화됩니다. (--universe_scope 또는 --infer_universe_scope) 및 --order_output=no입니다. --universe_scope=<target_pattern1>,...,<target_patternN>는 쿼리에 대상 패턴으로 지정된 대상 패턴의 전이적 클로저를 미리 로드하여 덧셈 및 뺄셈이 모두 됩니다. 그러면 모든 쿼리가 이 '범위'에서 평가됩니다. 특히 allrdepsrbuildfiles 연산자는 이 범위의 결과만 반환합니다. --infer_universe_scope는 Bazel에게 --universe_scope 값을 추론하도록 지시합니다. 추출해야 합니다. 이 추론된 값은 이는 원하는 결과가 아닐 수도 있습니다 예를 들면 다음과 같습니다.

bazel query --infer_universe_scope --order_output=no "allrdeps(//my:target)"

이 쿼리 표현식의 고유한 대상 패턴 목록은 ["//my:target"]이므로 Bazel은 이를 호출과 동일하게 처리합니다.

bazel query --universe_scope=//my:target --order_output=no "allrdeps(//my:target)"

하지만 이 --universe_scope를 사용한 쿼리의 결과는 //my:target뿐입니다. //my:target의 역 종속 항목은 모두 우주에 없습니다. 건설 중이에요! 반면에 다음 사항을 고려하세요.

bazel query --infer_universe_scope --order_output=no "tests(//a/... + b/...) intersect allrdeps(siblings(rbuildfiles(my/starlark/file.bzl)))"

이는 tests 정의가 특정 .bzl 파일을 사용하는 대상에 전이적으로 종속됩니다. 여기에서 --infer_universe_scope는 편리하며, 특히 그러지 않으면 --universe_scope에서 쿼리 표현식을 직접 파싱해야 합니다.

따라서 다음과 같은 유니버스 범위 연산자를 사용하는 쿼리 표현식의 경우 allrdepsrbuildfiles를 사용하려면 원하는 동작인 경우에만 --infer_universe_scope

Sky Query는 기본 쿼리에 비해 몇 가지 장단점이 있습니다. 주요 단점은 그래프 순서에 따라 출력을 정렬할 수 없기 때문에 출력 형식은 금지됩니다. 이 방법의 장점은 2개의 연산자 (allrdepsrbuildfiles)를 사용합니다. 또한 Sky Query는 스카이프레임 그래프에서 새 이미지를 만드는 대신 그래프인 만큼 기본 구현이 이루어집니다. 따라서 일부 상황에서는 더 빠르고 메모리를 더 적게 사용합니다.

표현식: 문법의 구문 및 의미

다음은 EBNF 표기법으로 표현된 Bazel 쿼리 언어의 문법입니다.

expr ::= word
       | let name = expr in expr
       | (expr)
       | expr intersect expr
       | expr ^ expr
       | expr union expr
       | expr + expr
       | expr except expr
       | expr - expr
       | set(word *)
       | word '(' int | word | expr ... ')'

다음 섹션에서는 이 문법이 생성되는 각 내용을 순서대로 설명합니다.

대상 패턴

expr ::= word

구문적으로 타겟 패턴은 단어입니다. 이는 (정렬되지 않은) 타겟 집합입니다. 가장 단순한 대상 패턴은 라벨이며, 단일 대상 (파일 또는 규칙)을 식별합니다. 예를 들어 대상 패턴은 //foo:bar는 하나의 요소(타겟인 bar)가 포함된 세트로 평가됩니다. 있습니다.

대상 패턴은 라벨을 일반화하여 패키지에 대한 와일드 카드를 포함하고 있습니다 예를 들어 foo/...:all (또는 foo/...)은 대상 패턴입니다. 모든 패키지의 모든 규칙을 포함하는 집합으로 재귀적으로 평가됩니다. foo 디렉터리 아래 bar/baz:all는 대상 패턴입니다. 는 bar/baz 패키지의 모든 규칙을 포함하지만 하위 패키지입니다.

마찬가지로 foo/...:*는 모든 대상 (규칙 파일)은 foo 디렉터리 bar/baz:*bar/baz 패키지(하위 패키지 제외)를 지원합니다.

:* 와일드 카드는 파일 및 규칙과 일치하므로 :all보다 유용할 수 있습니다. 반대로 :all 와일드 카드( foo/...)와 같은 대상 패턴이 일반적으로 빌드에 더 유용합니다.

bazel query 타겟 패턴은 bazel build 빌드 타겟과 동일하게 작동합니다. 자세한 내용은 타겟 패턴을 참고하세요. bazel help target-syntax를 입력합니다.

표적 패턴은 단일 집합 (라벨의 경우)과 많은 요소를 포함하는 집합 (foo/...의 경우 대상 패턴이 타겟과 일치하지 않는 경우 빈 집합으로 지정됩니다.

대상 패턴 표현식의 결과에 있는 모든 노드가 올바르게 정렬됩니다. 상대적 관계를 지닙니다. 이 경우 foo:*foo 패키지의 타겟 집합일 뿐만 아니라 그래프를 작성해 보세요. (게재위치의 상대적 순서는 보장되지 않습니다. 다른 노드와 비교하여 다른 노드와 비교해 비교할 수 있습니다.) 자세한 내용은 그래프 순서 섹션에 표시됩니다.

변수

expr ::= let name = expr1 in expr2
       | $name

Bazel 쿼리 언어를 사용하면 변수로 사용할 수 있습니다. let 표현식의 평가 결과는 다음과 동일합니다. expr2의 비율(모든 무료 어커런스 포함) 변수 name의 값을 expr1.

예를 들어 let v = foo/... in allpaths($v, //common) intersect $v는 다음과 같습니다. allpaths(foo/...,//common) intersect foo/...와 같습니다.

다음 위치에서 다른 변수 참조 name이(가) 발생했습니다. 인클로징 let name = ... 표현식은 오류가 발생했습니다. 즉, 최상위 쿼리 표현식에는 사용 가능 여부가 포함될 수 없습니다. 변수로 사용할 수 있습니다.

위의 문법 생성에서 name단어와 같지만 C 프로그래밍의 법적 식별자라는 추가 제약 조건 있습니다. 변수에 대한 참조 앞에 '$'를 추가해야 합니다. 있습니다.

let 표현식은 단일 변수만 정의하지만 중첩할 수 있습니다.

타겟 패턴과 변수 참조는 모두 하나의 토큰, 단어만으로 인해 구문이 모호해집니다. 그러나 단어의 하위 집합이 법적 변수로 표시되기 때문에 의미상 모호함이 없음 단어의 하위 집합에서 분리됩니다.

엄밀히 말해 let 표현식은 증가하지 않습니다. 쿼리 언어의 표현 가능성: 표현이 가능합니다. 그러나 많은 쿼리의 간결성을 개선하고 쿼리 평가를 효율적으로 수행할 수 있습니다

괄호로 묶인 표현식

expr ::= (expr)

괄호는 하위 표현식을 연결하여 평가 순서를 강제합니다. 괄호로 묶인 표현식은 인수의 값으로 평가됩니다.

대수 집합 연산: 교집합, 합집합, 차액 설정

expr ::= expr intersect expr
       | expr ^ expr
       | expr union expr
       | expr + expr
       | expr except expr
       | expr - expr

이 세 연산자는 인수에 대해 일반적인 set 연산을 계산합니다. 각 연산자에는 두 가지 형식이 있습니다. 명목 형식(예: intersect)과 기호 형식(예: ^) 두 양식 모두 동일합니다. 기호 형식은 더 빠르게 입력할 수 있습니다 (명확히 하기 위해 이 페이지의 나머지 부분에서는 명사 형식을 사용합니다.)

예를 들면 다음과 같습니다.

foo/... except foo/bar/...

foo/...와 일치하지만 foo/bar/...와 일치하지 않는 타겟 집합으로 평가됩니다.

다음과 같은 쿼리를 작성할 수 있습니다.

foo/... - foo/bar/...

intersect (^) 및 union (+) 연산은 가환성 (대칭)입니다. except (-)는 비대칭입니다. 파서는 세 연산자를 모두 우선순위가 같으므로 괄호를 사용할 수도 있습니다. 대상 예를 들어 처음 두 표현식은 동일하지만 세 번째 표현식은 다릅니다.

x intersect y union z
(x intersect y) union z
x intersect (y union z)

외부 소스에서 대상 읽기: 설정

expr ::= set(word *)

set(a b c ...) 연산자는 0개 이상의 집합의 합집합을 계산합니다. 타겟 패턴으로, 공백 (쉼표 없음)으로 구분됩니다.

set()는 Bourne 셸의 $(...) 기능과 함께 다음을 제공합니다. 하나의 쿼리의 결과를 일반 텍스트 파일에 저장하고, 다른 프로그램 (예: 표준 UNIX 셸 툴)을 사용하여 해당 텍스트 파일을 다운로드한 다음 추가 정보를 위한 값으로 쿼리 도구에 결과를 다시 도입합니다. 가장 적합합니다 예를 들면 다음과 같습니다.

bazel query deps(//my:target) --output=label | grep ... | sed ... | awk ... > foo
bazel query "kind(cc_binary, set($(<foo)))"

다음 예에서 kind(cc_library, deps(//some_dir/foo:main, 5))awk 프로그램을 사용하여 maxrank 값을 필터링하여 계산됩니다.

bazel query 'deps(//some_dir/foo:main)' --output maxrank | awk '($1 < 5) { print $2;} ' > foo
bazel query "kind(cc_library, set($(<foo)))"

이 예에서 $(<foo)$(cat foo)의 약칭이지만 셸은 이전 awk 명령어와 같이 cat 이외의 명령어도 사용될 수 있습니다.

함수

expr ::= word '(' int | word | expr ... ')'

쿼리 언어는 여러 함수를 정의합니다. 함수 이름 필요한 인수의 수와 유형을 결정합니다. 다음 함수를 사용할 수 있습니다.

종속 항목의 임시 폐쇄: deps

expr ::= deps(expr)
       | deps(expr, depth)

deps(x) 연산자는 형성된 그래프로 평가됩니다. 인수 집합의 종속 항목의 전이적 종료에 의해 x입니다. 예를 들어 deps(//foo)의 값은 단일 노드 foo에 루팅된 종속 항목 그래프(모든 종속 항목이 포함됩니다 deps(foo/...)의 값은 루트가 foo 디렉터리 아래 모든 패키지의 모든 규칙입니다. 이러한 맥락에서 '종속 항목' 이는 규칙 및 파일 대상만 의미하므로 BUILD 및 이러한 타겟을 만드는 데 필요한 Starlark 파일은 여기에 포함되어 있지 않습니다. 그러려면 buildfiles 연산자를 사용해야 합니다.

결과 그래프는 종속 항목 관계에 따라 정렬됩니다. 자세한 내용은 자세한 내용은 그래프 순서 섹션을 참고하세요.

deps 연산자는 정수인 두 번째 인수(선택사항)를 허용합니다. 검색 심도의 상한값을 지정하는 리터럴입니다. 그래서 deps(foo:*, 0)foo 패키지의 모든 타겟을 반환하는 반면, deps(foo:*, 1)에는 foo 패키지, deps(foo:*, 2)에 노드를 직접 포함함 deps(foo:*, 1)의 노드에서 도달 가능한 방식 등입니다. (이 번호 minrank 출력 형식에 표시된 순위에 해당합니다.) depth 매개변수를 생략하면 검색은 다음과 같습니다. unbounded: 선행 조건의 반사적 전이적 클로저를 계산합니다.

역 종속 항목의 임시 폐쇄: rdeps

expr ::= rdeps(expr, expr)
       | rdeps(expr, expr, depth)

rdeps(u, x) 연산자는 인수 집합의 역종속 항목을 평가합니다. 유니버스 세트의 전이적 폐쇄 내의 x u입니다.

결과 그래프는 종속 항목 관계에 따라 정렬됩니다. 자세한 내용은 그래프 순서 섹션을 참조하세요.

rdeps 연산자는 정수인 세 번째 인수(선택사항)를 허용합니다. 검색 심도의 상한값을 지정하는 리터럴입니다. 결과 그래프에는 임의의 지점에서 지정된 깊이의 거리 내에 있는 노드만 노드입니다. 따라서 rdeps(//foo, //common, 1)는 모든 노드로 평가됩니다. //common에 직접적으로 종속되는 //foo의 전이적 클로저 (이 숫자는 minrank 출력에 표시된 순위에 해당합니다. format.) depth 매개변수를 생략하면 검색에는 한계가 없습니다.

모든 역 종속 항목의 임시 폐쇄: allrdeps

expr ::= allrdeps(expr)
       | allrdeps(expr, depth)

allrdeps 연산자는 rdeps 연산자와 같습니다. 단, 'universe set'는 --universe_scope 플래그가 지정된 별도로 지정되지 않고 평가되어야 합니다. 따라서 --universe_scope=//foo/...이(가) 전달되었으며 allrdeps(//bar)이(가) 전달되었습니다. rdeps(//foo/..., //bar)와 같습니다.

동일한 패키지의 직접 역 종속 항목: same_pkg_direct_rdeps

expr ::= same_pkg_direct_rdeps(expr)

same_pkg_direct_rdeps(x) 연산자는 전체 타겟 집합으로 평가됩니다. 인수 집합의 타겟과 동일한 패키지에 있고 이에 직접적으로 종속되는 것들입니다.

대상의 패키지 처리: 형제

expr ::= siblings(expr)

siblings(x) 연산자는 다음 위치에 있는 전체 타겟 집합으로 평가됩니다. 인수 집합의 타겟과 동일한 패키지입니다.

임의의 선택: 일부

expr ::= some(expr)
       | some(expr, count )

some(x, k) 연산자 에서 최대 k개의 타겟을 임의로 선택 인수 집합 x이고, 다음 값을 포함하는 집합으로 평가됩니다. 지정할 수 있습니다. k 매개변수는 선택사항입니다. 조건: 누락된 경우 결과는 하나의 타겟만 포함하는 싱글톤 세트가 됩니다. 무작위로 선택됩니다. 인수 집합 x의 크기가 k보다 작은 경우 전체 인수 집합 x가 반환됩니다.

예를 들어 some(//foo:main union //bar:baz) 표현식은 //foo:main 또는 //bar:baz를 포함하는 싱글톤 세트입니다. 하지만 정의될 수 없습니다 표현식 some(//foo:main union //bar:baz, 2) 또는 some(//foo:main union //bar:baz, 3)//foo:main//bar:baz입니다.

인수가 싱글톤이면 some 항등식 함수를 계산합니다. some(//foo:main)//foo:main와 같습니다.

다음과 같이 지정된 인수 집합이 비어 있으면 오류입니다. 표현식 some(//foo:main intersect //bar:baz).

경로 연산자: somepath, allpaths

expr ::= somepath(expr, expr)
       | allpaths(expr, expr)

somepath(S, E)allpaths(S, E) 연산자 컴퓨팅 경로를 보여줍니다. 두 쿼리 모두 인수, 시작점의 S 집합, 종료점의 E입니다. somepath는 대상에서 시작된 일부 임의 경로의 노드 그래프 E의 대상에 대한 S allpaths 는 대상의 모든 경로에 있는 노드 그래프를 E의 모든 타겟에 대해 S

결과 그래프는 종속성 관계에 따라 정렬됩니다. 자세한 내용은 그래프 순서 섹션을 참고하세요.

경로
somepath(S1 + S2, E), 가능한 결과 1개
경로
somepath(S1 + S2, E), 다른 결과일 수 있습니다.
모든 경로
allpaths(S1 + S2, E)

대상 종류 필터링: 종류

expr ::= kind(word, expr)

kind(pattern, input) 연산자는 일련의 대상에 필터를 적용하고 해당 타겟을 삭제합니다. 할 수 있습니다. pattern 매개변수는 일치시킬 타겟의 종류를 지정합니다.

예를 들어 BUILD 파일에서 정의된 4개의 타겟의 종류 (p 패키지의 경우)은 아래 표에 나와 있습니다.

코드 타겟 종류
        genrule(
            name = "a",
            srcs = ["a.in"],
            outs = ["a.out"],
            cmd = "...",
        )
      
//p:a genrule 규칙
//p:a.in 소스 파일
//p:a.out 생성된 파일
//p:BUILD 소스 파일

따라서 kind("cc_.* rule", foo/...)는 집합으로 평가됩니다. (cc_library, cc_binary 등) foo 아래의 규칙 대상 및 kind("source file", deps(//foo)) 전이 폐쇄의 모든 소스 파일 집합으로 평가됩니다. //foo 타겟의 종속 항목 개수와 동일합니다.

pattern 인수의 따옴표가 필요한 경우가 많음 이 표현식이 없으면 source file.*_test와 같은 많은 정규 표현식이 파서에 의해 단어로 간주되지 않기 때문입니다.

package group과(와) 일치하면 다음으로 끝나는 타겟 :all에서 결과를 반환하지 못할 수 있습니다. 대신 :all-targets를 사용하세요.

대상 이름 필터링: 필터

expr ::= filter(word, expr)

filter(pattern, input) 연산자는 일련의 대상에 필터를 적용하고 라벨 (절대 형식)이 패턴과 일치하지 않습니다. 이 항목 입력의 하위 집합으로 평가됩니다.

첫 번째 인수 pattern는 대상 이름에 대한 정규 표현식. filter 표현식 모든 타겟 x을 포함하는 세트로 평가되어 x는 집합 input의 멤버이며 라벨 (절대 형식, 예: //foo:bar) 의 x에 (고정되지 않은) 일치 항목이 포함되어 있습니다. (정규식 pattern). 모든 타겟 이름은 //로 시작하며, 대신 사용할 수 있습니다. ^ 정규 표현식 앵커에 추가합니다.

이 연산자는 대개 범용 웹 서버보다 훨씬 빠르고 강력한 대안을 제공합니다. intersect 연산자. 예를 들어 //foo:foo 타겟의 종속 항목 bar개 평가

deps(//foo) intersect //bar/...

하지만 이 문에서는 BUILD 파일의 구문 분석이 bar 트리로, 학습이 느리고 관련 없는 BUILD 파일입니다. 대안은 다음과 같습니다.

filter(//bar, deps(//foo))

먼저 //foo 종속 항목 집합을 계산하고 지정된 패턴과 일치하는 대상만 필터링합니다. 단어, 이름에 하위 문자열로 //bar가 포함된 타겟

filter(pattern, expr) 연산자의 또 다른 일반적인 용도는 지정할 수 있습니다 예를 들면 다음과 같습니다.

filter("\.cc$", deps(//foo))

//foo 빌드에 사용되는 모든 .cc 파일의 목록을 제공합니다.

규칙 속성 필터링: attr

expr ::= attr(word, word, expr)

attr(name, pattern, input) 연산자는 일련의 타겟에 필터를 적용하고 그렇지 않은 타겟을 삭제합니다. 규칙, name 속성이 없는 규칙 대상 속성 값이 제공된 정규 표현식 pattern; 평가 하위 집합으로 전달됩니다

첫 번째 인수 name는 규칙의 이름입니다. 제공된 속성과 일치해야 하는 정규 표현식 패턴. 두 번째 인수는 pattern는 속성에 대한 정규 표현식입니다. 값으로 사용됩니다. attr 표현식은 모든 타겟을 포함하는 세트로 평가됩니다. x x 집합 input의 멤버는 속성(name)을 포함하고 속성 값에 (고정되지 않은) 정규 표현식 일치 pattern입니다. name가 다음에 해당하는 경우 선택적 속성 및 규칙이 명시적으로 지정하지 않은 경우 기본값 속성 값이 비교에 사용됩니다. 예를 들면 다음과 같습니다.

attr(linkshared, 0, deps(//foo))

해당 종속 항목을 보유할 수 있는 모든 //foo개의 종속 항목을 선택합니다. linkshared 속성 (예: cc_binary 규칙)을 정의하고 명시적으로 0으로 설정하거나 아예 설정하지 않고 기본값은 0입니다 (예: 규칙 cc_binary개).

목록 유형 속성 (예: srcs, data 등)은 [value<sub>1</sub>, ..., value<sub>n</sub>] 형식의 문자열로 변환됩니다. [ 괄호로 시작해서 ] 괄호로 끝남 ',' 사용 (쉼표, 공백)을 사용하여 여러 값을 구분합니다. 라벨은 라벨을 지정합니다. 예를 들어 deps=[":foo", "//otherpkg:bar", "wiz"] 속성은 문자열 [//thispkg:foo, //otherpkg:bar, //thispkg:wiz]입니다. 괄호는 항상 있으므로 빈 목록은 문자열 값 []을 사용합니다. 매칭을 목적으로 합니다 예를 들면 다음과 같습니다.

attr("srcs", "\[\]", deps(//foo))

//foo 종속 항목 중에서 비어 있는 srcs 속성,

attr("data", ".{3,}", deps(//foo))

다음에서 지정하는 //foo개의 종속 항목 중에서 모든 규칙을 선택합니다. data 속성에 하나 이상의 값 (모든 라벨이 //:로 인해 3자).

다음 열에 특정 value가 있는 //foo 종속 항목 중에서 모든 규칙을 선택하려면 목록 유형 속성의 경우

attr("tags", "[\[ ]value[,\]]", deps(//foo))

이는 value 앞의 문자가 [이거나 공백이고 value 다음에 오는 문자는 쉼표 또는 ]입니다.

규칙 공개 상태 필터링: 공개

expr ::= visible(expr, expr)

visible(predicate, input) 연산자 필터를 타겟 집합에 적용하고 필터를 적용하지 않은 타겟은 공개 상태를 유지해야 합니다

첫 번째 인수 predicate는 볼 수 있어야 합니다 visible 표현식 모든 타겟 x을 포함하는 세트로 평가하여 x 이 집합의 inputy predicate x이(가) y에 공개됩니다. 예를 들면 다음과 같습니다.

visible(//foo, //bar:*)

//bar 패키지에서 //foo하는 모든 타겟을 선택합니다. 공개 상태 제한을 위반하지 않고 종속될 수 있습니다.

라벨 유형의 규칙 속성 평가: 라벨

expr ::= labels(word, expr)

labels(attr_name, inputs) 연산자는 'label' 유형의 속성 attr_name 또는 '라벨 목록' 인치 세트 inputs에 일부 규칙이 있습니다.

예를 들어 labels(srcs, //foo)srcs 속성에 표시되는 타겟 //foo 규칙 여러 규칙이 있는 경우 inputs 세트에 srcs 속성이 있는 경우 srcs의 합집합이 반환됩니다.

test_suites 확장 및 필터링: 테스트

expr ::= tests(expr)

tests(x) 연산자는 모든 테스트 집합을 반환합니다. 세트 x의 규칙, 모든 test_suite 규칙을 개발자가 참조하는 개별 테스트 세트를 지정하고 tagsize

기본적으로 쿼리 평가는 모든 test_suite 규칙에서 테스트 이외의 대상을 무시합니다. 이는 --strict_test_suite 옵션을 사용하여 오류로 변경되었습니다.

예를 들어 kind(test, foo:*) 쿼리는 *_testtest_suite 규칙 (foo 패키지에서) 모든 결과는 정의)의 foo 멤버와 일치해야 합니다. 반면에 tests(foo:*) 쿼리는 bazel test foo:*에 의해 실행될 개별 테스트: 여기에는 다른 패키지에 속한 테스트, 직접 또는 간접적으로 언급되는 규칙 test_suite개를 통해

패키지 정의 파일: buildfile

expr ::= buildfiles(expr)

buildfiles(x) 연산자는 집합을 반환합니다. 각 대상의 패키지를 정의하는 x 설정 즉, 각 패키지에 대해 BUILD 파일 그리고 load를 통해 참조하는 모든 .bzl 파일을 포함합니다. 이 또한 이 API가 포함된 패키지의 BUILD 파일을 반환합니다. load된 파일.

이 연산자는 일반적으로 어떤 파일 또는 특정 대상을 빌드하는 데 필요한 패키지(주로 아래의 --output package 옵션). 예를 들면 다음과 같습니다.

bazel query 'buildfiles(deps(//foo))' --output package

//foo가 전이적으로 종속되는 모든 패키지 집합을 반환합니다.

패키지 정의 파일: rbuildfiles

expr ::= rbuildfiles(word, ...)

rbuildfiles 연산자는 쉼표로 구분된 경로 프래그먼트 목록을 가져와서 다음을 반환합니다. 이러한 경로 프래그먼트에 전이적으로 종속되는 BUILD 파일의 집합입니다. 예를 들어 //foo가 패키지이면 rbuildfiles(foo/BUILD)//foo:BUILD 목표. foo/BUILD 파일에 load('//bar:file.bzl'... 후에 rbuildfiles(bar/file.bzl)이(가) 다음을 실행합니다. //foo:BUILD 타겟뿐 아니라 BUILD 타겟까지 //bar:file.bzl 로드

rbuildfiles 연산자의 범위는 --universe_scope 플래그. BUILD 파일 및 .bzl에 직접 대응하지 않는 파일 파일은 결과에 영향을 미치지 않습니다. 예를 들어 foo.cc와 같은 소스 파일은 무시됩니다. BUILD 파일에 명시적으로 언급된 경우에도 마찬가지입니다. 그러나 심볼릭 링크는 존중되므로 foo/BUILDbar/BUILD의 심볼릭 링크인 경우 rbuildfiles(bar/BUILD)의 결과에 //foo:BUILD이 포함됩니다.

rbuildfiles 연산자는 거의 도덕적으로 buildfiles 연산자. 하지만 이러한 도덕적 역전은 한 방향으로 더 강력하게 유지됩니다. rbuildfiles의 출력은 buildfiles의 입력 전자는 패키지에 BUILD 파일 타겟만 포함하므로 후자는 이러한 타겟을 포함할 수 있습니다. 다른 방향에서는 대응이 더 약합니다. 이 buildfiles 연산자의 출력은 모든 패키지 및 에 해당하는 타겟입니다 .bzl 필요한 각 파일을 생성합니다. 그러나 rbuildfiles 연산자의 입력은 다음과 같습니다. 해당 타겟이 아니라 해당 타겟에 상응하는 경로 프래그먼트입니다.

패키지 정의 파일: loadfiles

expr ::= loadfiles(expr)

loadfiles(x) 연산자는 다음 집합을 반환합니다. Starlark 파일과 함께 각 타겟의 패키지를 x로 설정합니다. 즉, 각 패키지에 대해 BUILD 파일에서 참조되는 .bzl 파일

출력 형식

bazel query는 그래프를 생성합니다. 콘텐츠, 형식, 정렬 기준을 지정해 bazel query에서 이 그래프 표시 사용하여 --output 명령줄 옵션을 사용할 수 있습니다.

스카이 쿼리로 실행할 때는 스카이 쿼리와 호환되는 출력 형식만 정렬되지 않은 출력이 허용됩니다. 특히 graph, minrank, maxrank 출력 형식은 금지되어 있습니다.

일부 출력 형식은 추가 옵션을 허용합니다. 이름 각 출력 옵션의 프리픽스는 따라서 --graph:factored--output=graph가 사용 중일 때 아무 효과가 없습니다 graph가 아닌 출력 형식이 사용되는 경우 마찬가지로 --xml:line_numbers은(는) --output=xml인 경우에만 적용됩니다. 있습니다.

검색결과 순서에 따라

쿼리 표현식은 항상 ' 그래프 순서 보존"이라는 개념으로, 결과를 제시할 수 있습니다. 또는 정렬되지 않은 방식으로 호출될 수 있습니다. 이것은 아닙니다. 결과 집합의 대상이나 쿼리가 계산되는 방식에 영향을 줄 수 있습니다. 그것만 결과가 stdout에 출력되는 방식에 영향을 줍니다. 게다가 현재 실행 중인 알파벳순으로 정렬될 수도 있고 그렇지 않을 수도 있습니다. --order_output 플래그를 사용하면 이 동작을 제어할 수 있습니다. --[no]order_results 플래그에는 --order_output 플래그의 일부이며 지원 중단되었습니다.)

이 플래그의 기본값은 auto이며, 결과를 사전순으로 출력합니다. 주문을 선택합니다. 그러나 somepath(a,b)를 사용하면 결과가 대신 deps 주문을 사용하세요.

이 플래그가 no이고 --output가 다음 중 하나인 경우 build, label, label_kind, location, package, proto 또는 xml이면 출력이 임의의 순서로 출력됩니다. 이것은 일반적으로 가장 빠른 옵션입니다. 하지만 --outputgraph, minrank 또는 maxrank: 이러한 형식을 사용하면 Bazel에서 항상 결과를 출력합니다. 정렬해야 합니다

이 플래그가 deps이면 Bazel은 결과를 토폴로지 순서, 즉 살펴보겠습니다 그러나 종속 항목 순서에 따라 정렬되지 않은 노드는 (둘 중 어느 한 쪽에서 다른 쪽으로의 경로가 없으므로)은 임의의 순서로 출력될 수 있습니다.

이 플래그가 full이면 Bazel은 노드를 완전히 확정적인 (전체) 순서로 출력합니다. 먼저 모든 노드는 알파벳순으로 정렬됩니다. 그런 다음 목록의 각 노드는 방문하지 않은 노드로 나가는 에지를 순회하는 포스트 오더 깊이 우선 검색 후속 노드의 알파벳순으로 표시됩니다. 마지막으로, 노드는 이 순서의 역순으로 인쇄됩니다. 방문 페이지도 확인할 수 있습니다.

이 순서로 노드를 인쇄하면 속도가 느려질 수 있으므로 결정성이 매우 중요합니다.

BUILD에 표시되는 것처럼 대상의 소스 양식 인쇄

--output build

이 옵션을 사용하면 각 타겟이 실제 BUILD 언어로 직접 작성됨 모든 변수 및 함수 호출 (예: glob, 매크로)가 확장되어 Starlark 매크로 중 하나입니다. 또한 각 유효 규칙은 generator_name 또는 generator_function) 값 는 유효한 규칙을 생성하기 위해 평가된 매크로의 이름을 제공합니다.

출력은 BUILD 파일과 동일한 구문을 사용하지만 그렇지 않습니다. 유효한 BUILD 파일을 생성할 수 있습니다

--output label

이 옵션을 사용하면 각 타겟의 이름 (또는 라벨) 집합이 한 줄에 하나의 라벨이 출력되며 위상 순서 (--noorder_results가 지정되지 않은 경우, 결과 순서 관련 참고사항). (토폴로지 순서는 그래프가 노드가 모든 후속 노드보다 먼저 나타납니다). 물론이지 는 그래프에 대해 가능한 많은 토폴로지 순서 지정이 가능합니다 (역순). postorder는 하나만 있음) 어느 것이 선택되었는지 알 수 없습니다.

somepath 쿼리의 출력을 출력할 때 노드가 출력되는 순서가 경로의 순서입니다.

주의사항: 일부 예외적인 경우에는 동일한 라벨이 지정되어 있습니다. 예를 들어 sh_binary 규칙 및 단독 (암시적) srcs 파일을 둘 다 호출할 수 있음 foo.sh입니다. 쿼리 결과에 타겟에 도달하면 출력 (label 형식)이 표시됩니다. 중복이 포함될 수 있습니다 label_kind( 두 표적이 되는 경우, 그 구분은 명확해집니다. 이름은 같지만 하나는 sh_binary rule 종류이고 다른 종류의 source file입니다.

--output label_kind

label와 마찬가지로 이 출력 형식은 결과 그래프의 각 타겟을 토폴로지 순서로 나열하지만 또한 라벨 앞에 대상의 kind가 옵니다.

--output proto

쿼리 출력을 QueryResult 드림 프로토콜 버퍼.

--output streamed_proto

다음을 출력합니다. 길이로 구분됨 스트림 Target 프로토콜 버퍼의 정의와 관련이 있습니다. (i) 탐색 시 유용합니다. 크기 제한 대상 프로토콜 버퍼가 너무 많아서 단일 버퍼에 맞추기에는 QueryResult 또는 (ii)를 사용하여 Bazel이 계속 출력되는 동안 처리를 시작할 수 있습니다.

--output textproto

--output proto와 유사하게 다음을 출력합니다. QueryResult 프로토콜 버퍼가 있지만 텍스트 형식입니다.

--output streamed_jsonproto

--output streamed_proto와 유사하게 Target ndjson 형식을 사용해야 합니다.

--output minrank --output maxrank

labelminrank과(와) 비슷한 콘텐츠 maxrank 출력 형식은 각 대상이지만, 결과 그래프에 표시되는 대신 해당 항목은 순위 번호입니다. 이는 결과 순서의 영향을 받지 않습니다. --[no]order_results 플래그 (다음의 참고사항 참조) 결과 순서).

이 형식에는 minrank 순위의 두 가지 변형이 있습니다. 루트 노드에서 해당 노드까지 최단 경로의 길이만큼 각 노드로 나눈 것입니다. '루트' 노드 (수신 에지가 없는 노드)의 순위는 0이며, 그 후계는 순위가 1 등입니다(항상 그렇듯이 모서리는 대상의 기본 조건, 즉 종속된 대상까지 바꾸어야 합니다.)

maxrank는 가장 긴 길이를 기준으로 각 노드의 순위를 지정합니다. 루트 노드에서 해당 경로로 이동하는 것입니다. 다시 말하지만 순위는 0이고 나머지는 모두 노드의 순위가 모든 노드의 최대 순위보다 하나 되었습니다.

한 주기의 모든 노드는 동일한 순위로 간주됩니다. (대부분의 그래프는 비순환적이지만 주기가 일어난다 BUILD 파일에 잘못된 주기가 포함되어 있기 때문입니다.)

이러한 출력 형식은 그래프의 깊이를 파악하는 데 유용합니다. deps(x), rdeps(x)의 결과에 사용되는 경우 또는 allpaths 쿼리인 경우 순위 번호는 가장 짧은 길이 (minrank 포함) 또는 가장 긴 길이 x에서 다음 노드로의 (maxrank 포함) 경로 알 수 있습니다. maxrank는 타겟 빌드에 필요한 가장 긴 빌드 단계의 시퀀스입니다.

예를 들어 왼쪽 그래프는 오른쪽의 결과를 산출합니다. 시기: --output minrank--output maxrank 각각 지정됩니다.

높은 순위를 차지함
      minrank

      0 //c:c
      1 //b:b
      1 //a:a
      2 //b:b.cc
      2 //a:a.cc
      
      maxrank

      0 //c:c
      1 //b:b
      2 //a:a
      2 //b:b.cc
      3 //a:a.cc
      
--output location

label_kind와 마찬가지로 각 문자열에 대해 이 옵션이 출력됩니다. 대상의 종류와 라벨을 포함하지만 해당 타겟의 위치를 설명하는 문자열이 앞에 붙습니다. 파일 이름 및 줄 번호를 입력합니다. 형식은 grep 따라서 Emacs와 같은 후자를 파싱할 수 있는 도구도 또는 vi)를 사용하여 일련의 쿼리를 단계별로 실행할 수도 있습니다. Bazel 쿼리 도구를 종속 항목 그래프 인식 'BUILD 파일의 grep'

위치 정보는 대상 종류에 따라 다릅니다 (종류 연산자 참조). 규칙의 경우 BUILD 파일 내 규칙 선언의 위치가 출력됩니다. 소스 파일의 경우 실제 파일의 1행 위치는 출력됩니다. 생성된 파일의 경우 출력됩니다. 쿼리 도구에 생성된 파일의 실제 위치를 찾기 위한 정보 어떤 경우든 빌드가 아직 수행되지 않은 경우 이 파일이 존재하지 않을 수 있습니다.)

--output package

이 옵션은 결과 집합의 일부 대상이 속하는지 확인할 수 있습니다. 이름은 사전순 개의 중복은 제외됩니다. 공식적으로 라벨 집합 (패키지, 타겟)을 기반으로 투영 패키지입니다

외부 저장소의 패키지 형식은 다음과 같습니다. 기본 저장소의 패키지는 @repo//foo/bar foo/bar 형식으로 지정됩니다.

deps(...) 쿼리와 함께 이 출력은 옵션을 사용하여 확인해야 할 패키지 세트를 찾을 수 있습니다. 빌드하려는 경우가 많습니다.

결과 그래프 표시

--output graph

이 옵션을 사용하면 쿼리 결과가 널리 사용되는 AT&T GraphViz 형식으로 되어 있습니다. 일반적으로 결과는 .png 또는 .svg와 같은 파일에 저장됩니다. 워크스테이션에 dot 프로그램이 설치되어 있지 않으면 sudo apt-get install graphviz 명령어를 사용하여 설치할 수 있습니다.) 샘플 호출은 아래의 예시 섹션을 참조하세요.

이 출력 형식은 allpaths, deps 또는 rdeps 쿼리(결과는 시각화할 때 쉽게 시각화할 수 없는 경로 집합을 포함합니다. --output label와 같은 선형 형식으로 렌더링됩니다.

기본적으로 그래프는 인수 분해 형식으로 렌더링됩니다. 즉, 위상적으로 동일한 노드는 단일 합으로 병합됩니다. 여러 라벨이 있는 노드 이렇게 하면 그래프가 더 간결해집니다. 일반적으로 결과 그래프에는 모델을 학습시킬 수 있습니다 예를 들어 java_library 규칙은 다음과 같습니다. 수백 개의 Java 소스 파일에 종속될 수도 있고 동일한 genrule 인수 분해 그래프에서 이러한 모든 파일은 단일 노드로 표시됩니다 이 동작은 사용 중지될 수 있습니다. --nograph:factored 옵션을 사용합니다.

--graph:node_limit n

이 옵션은 광고에 대한 라벨 문자열의 최대 길이를 출력됩니다. 긴 라벨은 잘립니다. -1명 는 잘림을 사용하지 않습니다. 왜냐하면 그래프는 인수 분해 형식으로 인해 일반적으로 출력되면 노드 라벨이 매우 길 수 있습니다. GraphViz에서는 기본값인 1, 024자를 초과하는 라벨을 처리합니다. 선택하겠습니다. 이 옵션은 --output=graph을(를) 사용 중입니다.

--[no]graph:factored

기본적으로 그래프는 설명된 대로 인수 분해 형식으로 표시됩니다. 에서 확인하세요. --nograph:factored를 지정하면 그래프가 출력됩니다. 이를 통해 GraphViz를 사용한 시각화가 가능합니다. 비실용적이지만 더 간단한 형식은 다른 사람들의 처리가 용이해질 수 도구 (예: grep) 이 옵션은 아무런 영향을 미치지 않습니다. --output=graph를 사용하지 않는 경우에 한합니다.

XML

--output xml

이 옵션을 사용하면 결과 대상이 XML로 인쇄됩니다. 양식을 작성해 주세요. 출력은 다음과 같은 XML 헤더로 시작합니다.

  <?xml version="1.0" encoding="UTF-8"?>
  <query version="2">

각 타겟에 대한 XML 요소로 계속 진행됩니다. 결과 그래프에 위상 순서로 정렬( 정렬되지 않은 결과가 요청됨) 종료

</query>

file 종류의 대상에 간단한 항목을 내보냅니다.

  <source-file name='//foo:foo_main.cc' .../>
  <generated-file name='//foo:libfoo.so' .../>

하지만 규칙의 경우 XML은 구조화되어 있으며 규칙의 속성(값이 지정되지 않은 속성 포함) BUILD 파일에 명시적으로 지정되어 있습니다.

또한 결과에는 rule-inputrule-output 요소가 추가되어야 그것도 모르는 사이에 종속 항목 그래프를 재구성할 수 있지만 예를 들어 srcs 속성의 요소는 다음과 같습니다. 선행 종속 항목 (선행 조건)과 outs 속성은 하위 종속 항목 (소비자)입니다.

다음과 같은 경우 암시적 종속 항목rule-input 요소가 억제됩니다. --noimplicit_deps가 지정되었습니다.

  <rule class='cc_binary rule' name='//foo:foo' ...>
    <list name='srcs'>
      <label value='//foo:foo_main.cc'/>
      <label value='//foo:bar.cc'/>
      ...
    </list>
    <list name='deps'>
      <label value='//common:common'/>
      <label value='//collections:collections'/>
      ...
    </list>
    <list name='data'>
      ...
    </list>
    <int name='linkstatic' value='0'/>
    <int name='linkshared' value='0'/>
    <list name='licenses'/>
    <list name='distribs'>
      <distribution value="INTERNAL" />
    </list>
    <rule-input name="//common:common" />
    <rule-input name="//collections:collections" />
    <rule-input name="//foo:foo_main.cc" />
    <rule-input name="//foo:bar.cc" />
    ...
  </rule>

타겟의 모든 XML 요소에는 name이 포함되어 있습니다. 속성(값이 타겟의 라벨) 대상의 값이 되는 location 속성 --output location에서 출력한 위치입니다.

--[no]xml:line_numbers

기본적으로 XML 출력에 표시되는 위치에는 줄 번호가 포함됩니다. --noxml:line_numbers가 지정되면 행 번호가 출력되지 않습니다.

--[no]xml:default_values

기본적으로 XML 출력에는 값이 있는 규칙 속성이 포함되지 않습니다. 은 해당 종류의 속성의 기본값입니다 (예: 이(가) BUILD 파일에 지정되지 않았거나 기본값이 명시적으로 제공됩니다. 이 옵션을 사용하면 이러한 속성 값이 XML 출력에 포함되어야 합니다.

정규 표현식

쿼리 언어의 정규 표현식은 Java 정규식 라이브러리를 사용하므로 전체 구문 java.util.regex.Pattern

외부 저장소로 쿼리

빌드가 외부 저장소( WORKSPACE 파일)로 검색하면 쿼리 결과에 이러한 종속 항목이 포함됩니다. 대상 예를 들어 //foo:bar//external:some-lib에 종속되는 경우 //external:some-lib@other-repo//baz:lib에 바인딩된 경우 bazel query 'deps(//foo:bar)'@other-repo//baz:lib//external:some-lib를 종속 항목으로 사용합니다.

외부 저장소 자체는 빌드의 종속 항목이 아닙니다. 즉, 위 예에서 //external:other-repo는 종속 항목이 아닙니다. 그것은 //external 패키지의 구성원으로 쿼리할 수 있습니다. 예를 들면 다음과 같습니다.

  # Querying over all members of //external returns the repository.
  bazel query 'kind(http_archive, //external:*)'
  //external:other-repo

  # ...but the repository is not a dependency.
  bazel query 'kind(http_archive, deps(//foo:bar))'
  INFO: Empty results