이 페이지는 bazel query
를 사용하여 빌드 종속 항목을 분석할 때 사용되는 Bazel 쿼리 언어의 참조 매뉴얼입니다. 또한 bazel query
에서 지원하는 출력 형식을 설명합니다.
실제 사용 사례는 Bazel 쿼리 방법 안내를 참조하세요.
추가 쿼리 참조
로드 후 단계 타겟 그래프에서 실행되는 query
외에도 Bazel에는 작업 그래프 쿼리와 구성 가능한 쿼리가 포함되어 있습니다.
작업 그래프 쿼리
작업 그래프 쿼리 (aquery
)는 사후 분석 구성된 대상 그래프에 대해 작동하며 작업, 아티팩트, 해당 관계에 대한 정보를 노출합니다. aquery
는 구성된 타겟 그래프에서 생성된 작업/아티팩트의 속성에 관심이 있을 때 유용합니다.
실제 명령어 실행 및 입력, 출력, 연상법 등을 예로 들 수 있습니다.
자세한 내용은 쿼리 참조를 확인하세요.
구성 가능한 쿼리
기존 Bazel 쿼리는 로드 후 단계 대상 그래프에서 실행되므로 구성 및 관련 개념의 개념이 없습니다. 특히, select 문을 올바르게 리졸브하지 않고 대신 select의 가능한 모든 해상도를 반환합니다. 그러나 구성 가능한 쿼리 환경 cquery
이 구성을 올바르게 처리하지만 이 원본 쿼리의 모든 기능을 제공하지는 않습니다.
자세한 내용은 cquery 참조를 확인하세요.
예
bazel query
사용 방식 다음은 일반적인 예입니다.
//foo
트리가 //bar/baz
에 종속되는 이유는 무엇인가요?
경로 표시:
somepath(foo/..., //bar/baz:all)
모든 foo
테스트는 foo_bin
타겟이 종속되지 않는 어떤 C++ 라이브러리에 종속되나요?
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, 특수 문자*/@.-_:$~[]
(별표, 슬래시, 앳, 마침표, 하이픈, 밑줄, 콜론, 달러 기호, 물결표, 왼쪽 대괄호, 오른쪽 대괄호)로 만든 시퀀스입니다. 그러나 상대적 [대상 이름][(/concepts/labels#target-names)이 이러한 문자로 시작할 수 있지만, 따옴표로 묶이지 않은 단어는 하이픈-
또는 별표*
로 시작할 수 없습니다.따옴표로 묶이지 않은 단어에는 문자 + 기호
+
또는 등호=
를 포함할 수 없습니다. 이러한 문자는 대상 이름에서 허용되는 경우에도 마찬가지입니다. 쿼리 표현식을 생성하는 코드를 작성할 때는 대상 이름을 따옴표로 묶어야 합니다.사용자 제공 값에서 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'는 모두 단어입니다.하지만 타겟 이름에 작은따옴표나 큰따옴표를 사용할 때는 주의해야 합니다. 타겟 이름을 하나 이상 인용할 때는 한 가지 유형의 따옴표만 사용합니다 (모두 작은따옴표 또는 모두 큰따옴표).
다음은 자바 쿼리 문자열의 예입니다.
'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)로 평가됩니다. 유일한 데이터 유형입니다.
설정 및 그래프는 동일한 데이터 유형을 나타내지만 서로 다른 측면을 강조합니다. 예를 들면 다음과 같습니다.
- 설정: 타겟의 부분 순서는 관심이 없습니다.
- 그래프: 타겟의 부분 순서는 중요합니다.
종속 항목 그래프의 순환
빌드 종속 항목 그래프는 비순환적이어야 합니다.
쿼리 언어에서 사용하는 알고리즘은 비순환 그래프에서 사용하도록 만들어졌지만 주기에서 견고합니다. 사이클의 취급 방식에 관한 세부정보는 지정되지 않으며 신뢰해서는 안 됩니다.
암시적 종속 항목
Bazel은 BUILD
파일에 명시적으로 정의된 빌드 종속 항목 외에도 규칙에 암시적 종속 항목을 추가합니다. 예를 들어 모든 자바 규칙은 암시적으로 JavaBuilder에 종속됩니다. 암시적 종속 항목은 $
로 시작하는 속성을 사용하여 설정되며 BUILD
파일에서 재정의할 수 없습니다.
기본적으로 bazel query
는 쿼리 결과를 계산할 때 암시적 종속 항목을 고려합니다. 이 동작은 --[no]implicit_deps
옵션을 사용하여 변경할 수 있습니다. 쿼리는 구성을 고려하지 않으므로 잠재적인 도구 모음은 고려되지 않습니다.
소리
Bazel 쿼리 언어 표현식은 빌드 종속 항목 그래프에서 작동합니다. 이 그래프는 모든 BUILD
파일의 모든 규칙 선언에 암시적으로 정의된 그래프입니다. 이 그래프는 다소 추상적이며 빌드의 모든 단계를 실행하는 방법에 관한 자세한 설명을 구성하지 않는다는 점을 알아야 합니다. 빌드를 실행하려면 구성도 필요합니다. 자세한 내용은 사용자 가이드의 구성 섹션을 참고하세요.
Bazel 쿼리 언어로 된 표현식을 평가한 결과는 모든 구성에 해당하며, 이 경우 정밀도가 낮은 보수적인 근사값일 수 있습니다. 쿼리 도구를 사용하여 빌드 중에 필요한 모든 소스 파일 세트를 계산할 경우, 실제로 필요한 것보다 많은 파일이 보고될 수 있습니다. 예를 들어 빌드 도구에서 이 기능을 사용할 의도가 없더라도 쿼리 도구에 메시지 변환을 지원하는 데 필요한 모든 파일이 포함되기 때문입니다.
그래프 순서 보존
작업은 하위 표현식에서 상속된 순서 제약 조건을 유지합니다. 이를 '부분 순서 보존의 법칙'이라고 생각할 수 있습니다. 예를 들어 쿼리를 실행하여 특정 타겟의 종속 항목의 전이적 종료를 확인하면 종속 항목 그래프에 따라 결과 집합이 정렬됩니다. file
종류의 타겟만 포함하도록 설정하는 경우 결과 쌍에 있는 모든 타겟 쌍 사이에 동일한 전이적 부분 순서 지정 관계가 적용됩니다. 단, 이러한 쌍이 원래 그래프에서 직접 직접 연결되어 있지는 않습니다.
빌드 종속 항목 그래프에는 파일 파일 에지가 없습니다.
그러나 모든 연산자는 순서를 보존하지만 set 연산과 같은 일부 작업은 자체 순서 지정 제약 조건을 도입하지 않습니다. 다음 표현식을 살펴보세요.
deps(x) union y
최종 결과 집합의 순서는 하위 표현식의 모든 순서 지정 제약 조건을 보존합니다. 즉, x
의 모든 전이 종속 항목이 서로에 따라 올바르게 정렬됩니다. 하지만 쿼리는 y
의 타겟 순서나 y
의 타겟과 비교하여 deps(x)
의 타겟 순서를 보장하지 않습니다 (deps(x)
에 있는 y
의 타겟 제외).
정렬 제약 조건을 도입하는 연산자로는 allpaths
, deps
, rdeps
, somepath
, 대상 패턴 와일드 카드 package:*
, dir/...
등이 있습니다.
스카이 쿼리
스카이 쿼리는 지정된 전체 범위에서 작동하는 쿼리 모드입니다.
SkyQuery에서만 사용할 수 있는 특수 함수
Sky 쿼리 모드에는 추가 쿼리 함수 allrdeps
및 rbuildfiles
가 있습니다. 이러한 함수는 전체 범위에서 작동합니다. 따라서 일반 쿼리에는 적합하지 않습니다.
우주 범위 지정
Sky Query 모드는 두 플래그(--universe_scope
또는 --infer_universe_scope
) 및 --order_output=no
을 전달하여 활성화됩니다.
--universe_scope=<target_pattern1>,...,<target_patternN>
은 대상 패턴에서 지정한 대상 패턴의 전이적 폐쇄를 미리 로드하도록 지시합니다(이 경우 가산 및 감산 모두 가능). 그러면 모든 쿼리가 이 '범위'에서 평가됩니다. 특히 allrdeps
및 rbuildfiles
연산자는 이 범위의 결과만 반환합니다.
--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)))"
이는 정의가 특정 .bzl
파일을 사용하는 대상에 전이적으로 종속되는 일부 디렉터리 아래의 타겟 tests
확장에서 테스트 타겟을 계산하려고 하는 의미 있는 쿼리 호출입니다. 여기서 --infer_universe_scope
는 편리합니다. 특히 --universe_scope
선택으로 쿼리 표현식을 직접 파싱해야 하는 경우 편리합니다.
따라서 allrdeps
및 rbuildfiles
와 같은 범용 범위 연산자를 사용하는 쿼리 표현식의 경우 원하는 동작인 경우에만 --infer_universe_scope
을 사용해야 합니다.
Sky Query는 기본 검색어에 비해 몇 가지 장단점이 있습니다. 주요 단점은 출력을 그래프 순서에 따라 정렬할 수 없으므로 특정 출력 형식이 금지된다는 점입니다. 이 API의 장점은 기본 쿼리에서 사용할 수 없는 두 연산자 (allrdeps
및 rbuildfiles
)를 제공한다는 것입니다.
또한 스카이 쿼리는 기본 구현인 새 그래프를 만드는 대신 Skyframe 그래프를 점검하여 작업을 수행합니다. 따라서 속도가 더 빠르고 메모리를 더 적게 사용하는 상황도 있습니다.
표현식: 문법의 구문 및 시맨틱스
다음은 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/...
와 같습니다.
인클로징 let name = ...
표현식이 아닌 변수 참조 name
가 발생하면 오류가 발생합니다. 즉, 최상위 쿼리 표현식에는 자유 변수가 포함될 수 없습니다.
위의 문법 프로덕션에서 name
는 단어와 비슷하지만, C 프로그래밍 언어의 법적 식별자라는 추가 제약 조건이 있습니다. 변수 참조는 앞에 '$' 문자를 추가해야 합니다.
각 let
표현식은 변수를 하나만 정의하지만 중첩할 수 있습니다.
대상 패턴과 변수 참조는 모두 하나의 토큰, 단어로 구성되므로 구문의 모호성이 형성됩니다. 하지만 법적 변수 이름인 단어의 하위 집합은 법적 대상 패턴인 단어의 하위 집합과 분리되므로 의미적 모호성이 없습니다.
기술적으로 볼 때 let
표현식은 쿼리 언어의 표현성을 증가시키지 않습니다. 언어로 표현 가능한 모든 쿼리도 표현식 없이 표현될 수 있습니다. 하지만 많은 쿼리의 간결함을 개선하고 더 효율적인 쿼리 평가로 이어질 수도 있습니다.
괄호 표현식
expr ::= (expr)
괄호는 하위 표현식을 연결하여 평가 순서를 강제합니다. 괄호로 묶인 표현식은 인수 값으로 평가됩니다.
대수 집합 연산: 교집합, 합집합, 차이 설정
expr ::= expr intersect expr
| expr ^ expr
| expr union expr
| expr + expr
| expr except expr
| expr - expr
이 세 연산자는 인수를 통해 일반적인 집합 연산을 계산합니다.
각 연산자에는 명사형(예: 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)
외부 소스에서 대상 읽기: set
expr ::= set(word *)
set(a b c ...)
연산자는 쉼표 없이 공백으로 구분된 0개 이상의 대상 패턴 합집합을 계산합니다.
set()
는 $(...)
예를 들면 다음과 같습니다.
bazel query deps(//my:target) --output=label | grep ... | sed ... | awk ... > foo
bazel query "kind(cc_binary, set($(<foo)))"
다음 예에서 awk
프로그램을 사용하여 maxrank
값을 필터링하여 kind(cc_library, deps(//some_dir/foo:main, 5))
를 계산합니다.
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)
의 약식 표현이지만 cat
외의 셸 명령어(예: 위의 awk
명령어)도 사용할 수 있습니다.
함수
expr ::= word '(' int | word | expr ... ')'
쿼리 언어는 여러 함수를 정의합니다. 함수의 이름에 따라 필요한 인수의 수와 유형이 결정됩니다. 다음 함수를 사용할 수 있습니다.
allpaths
attr
buildfiles
rbuildfiles
deps
filter
kind
labels
loadfiles
rdeps
allrdeps
same_pkg_direct_rdeps
siblings
some
somepath
tests
visible
종속 항목의 전이적 종료: 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 매개변수가 생략되면 검색이 제한되지 않습니다. 즉, 기본 요건의 재귀적 전이적 클로저를 계산합니다.
종속 항목 역전이 폐쇄: rdeps
expr ::= rdeps(expr, expr)
| rdeps(expr, expr, depth)
rdeps(u, x)
연산자는 u 집합의 전이적 닫힌 내에서 인수 집합 x의 역방향 종속 항목으로 평가됩니다.
결과 그래프는 종속 항목 관계에 따라 정렬됩니다. 자세한 내용은 그래프 순서 섹션을 참고하세요.
rdeps
연산자는 검색 심도의 상한을 지정하는 정수 리터럴인 세 번째 인수(선택사항)를 허용합니다. 결과 그래프에는 인수 집합에 포함된 모든 노드로부터 지정된 거리만큼 떨어진 노드만 포함됩니다. 따라서 rdeps(//foo, //common, 1)
는 //common
에 직접 종속되는 //foo
의 전이 클로저에 있는 모든 노드를 평가합니다. 이 숫자는 minrank
출력 형식에 표시된 순위와 일치합니다. depth 매개변수를 생략하면 검색이 제한되지 않습니다.
모든 역방향 종속 항목의 전이적 종료: allrdeps
expr ::= allrdeps(expr)
| allrdeps(expr, depth)
allrdeps
연산자는 rdeps
연산자와 동일하게 작동하지만 '유니버스 세트'는 별도로 지정되지 않고 --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
는 ID 함수를 계산합니다. some(//foo:main)
는 //foo:main
와 같습니다.
some(//foo:main intersect //bar:baz)
표현식과 같이 지정된 인수 집합이 비어 있으면 오류가 발생합니다.
경로 연산자: 일부 경로, 모든 경로
expr ::= somepath(expr, expr)
| allpaths(expr, expr)
somepath(S, E)
연산자와 allpaths(S, E)
연산자는 두 대상 집합 간의 경로를 계산합니다. 두 쿼리 모두 시작 지점의 S 집합과 종료 지점의 E 집합이라는 두 인수를 허용합니다. somepath
는 S의 대상에서 E의 대상으로 가는 일부 임의 경로에 있는 노드의 그래프를 반환합니다. allpaths
는 S의 모든 대상에서 E의 대상으로 가는 모든 경로의 노드 그래프를 반환합니다.
결과 그래프는 종속 항목 관계에 따라 정렬됩니다. 자세한 내용은 그래프 순서 섹션을 참고하세요.
somepath(S1 + S2, E) , 예상 결과 1개 |
somepath(S1 + S2, E) , 다른 가능한 결과. |
allpaths(S1 + S2, E) |
대상 종류 필터링: 종류
expr ::= kind(word, expr)
kind(pattern, input)
연산자는 타겟 집합에 필터를 적용하고 예상된 종류가 아닌 대상을 삭제합니다. pattern 매개변수는 일치시킬 대상의 종류를 지정합니다.
예를 들어, 아래에 표시된 BUILD
파일(패키지 p
)에서 정의된 네 가지 대상의 종류가 아래 표에 나와 있습니다.
코드 | 대상 | 종류 |
---|---|---|
genrule( name = "a", srcs = ["a.in"], outs = ["a.out"], cmd = "...", ) |
//p:a |
일반 규칙 |
//p:a.in |
소스 파일 | |
//p:a.out |
생성된 파일 | |
//p:BUILD |
소스 파일 |
따라서 kind("cc_.* rule", foo/...)
는 foo
아래의 모든 cc_library
, cc_binary
등의 규칙 타겟 집합과 //foo
타겟의 종속 항목 전이적 클로저에 있는 모든 소스 파일 세트로 평가합니다.kind("source file", deps(//foo))
pattern 인수가 없는 경우 파서에 의해 많은 정규 표현식(예: source
file
, .*_test
)이 단어로 간주되지 않기 때문에 따옴표가 필요합니다.
package group
와 일치하는 경우 :all
로 끝나는 대상은 결과를 반환하지 않을 수 있습니다. 대신 :all-targets
를 사용하세요.
대상 이름 필터링: 필터
expr ::= filter(word, expr)
filter(pattern, input)
연산자는 타겟 집합에 필터를 적용하고 라벨이 (절편 형태의) 패턴과 일치하지 않는 대상을 삭제합니다. 입력의 하위 집합으로 평가됩니다.
첫 번째 인수인 pattern는 대상 이름 위에 정규 표현식이 포함된 단어입니다. filter
표현식은 모든 대상 x를 포함하는 세트로 평가됩니다. 예를 들어 x는 집합 input의 멤버이고 x의 라벨 (//foo:bar
과 같은 절대 형식)에는 정규 표현식 pattern에 대한 (고정되지 않은) 일치 항목이 포함됩니다. 모든 대상 이름은 //
로 시작하므로 ^
정규 표현식 앵커의 대안으로 사용할 수 있습니다.
이 연산자는 intersect
연산자보다 훨씬 빠르고 강력한 대안을 제공하는 경우가 많습니다. 예를 들어 //foo:foo
대상의 bar
종속 항목을 모두 보려면
deps(//foo) intersect //bar/...
하지만 이 문을 실행하려면 bar
트리의 모든 BUILD
파일을 파싱해야 하므로 속도가 느리고 관련 없는 BUILD
파일에서 오류가 발생하기 쉽습니다. 대안은 다음과 같습니다.
filter(//bar, deps(//foo))
이 메서드는 먼저 //foo
종속 항목 집합을 계산한 다음 제공된 패턴과 일치하는 타겟, 즉 //bar
을 하위 문자열로 포함하는 이름을 가진 대상만 필터링합니다.
filter(pattern,
expr)
연산자의 또 다른 일반적인 용도는 특정 파일을 이름 또는 확장자로 필터링하는 것입니다. 예를 들면 다음과 같습니다.
filter("\.cc$", deps(//foo))
//foo
를 빌드하는 데 사용되는 모든 .cc
파일의 목록을 제공합니다.
규칙 속성 필터링: 속성
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
종속 항목을 선택하고 (예: 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))
srcs
속성이 비어 있는 //foo
종속 항목 중에서 모든 규칙을 선택합니다.
attr("data", ".{3,}", deps(//foo))
data
속성에서 하나 이상의 값을 지정하는 //foo
종속 항목 중에서 모든 규칙을 선택합니다 (//
및 :
로 인해 모든 라벨의 길이가 최소 3자 이상).
목록 유형 속성에 특정 value
가 있는 //foo
종속 항목 중에서 모든 규칙을 선택하려면
attr("tags", "[\[ ]value[,\]]", deps(//foo))
value
앞에 있는 문자가 [
또는 공백이고 value
뒤에 있는 문자가 쉼표 또는 ]
가 되기 때문입니다.
규칙 공개 상태 필터링: 표시
expr ::= visible(expr, expr)
visible(predicate, input)
연산자는 타겟 집합에 필터를 적용하고 필수 공개 상태 없이 대상을 삭제합니다.
첫 번째 인수인 predicate는 출력의 모든 대상을 표시해야 하는 타겟 집합입니다. visible 표현식은 x가 input 집합의 구성원인 모든 대상 x를 포함하는 세트로 평가되고, predicate x의 모든 대상 y에 대해 y에 표시됩니다. 예를 들면 다음과 같습니다.
visible(//foo, //bar:*)
공개 상태 제한을 위반하지 않고 //foo
가 종속될 수 있는 //bar
패키지의 모든 타겟을 선택합니다.
라벨 유형: 라벨 규칙의 평가
expr ::= labels(word, expr)
labels(attr_name, inputs)
연산자는 inputs 집합의 일부 규칙에서 'label' 또는 '라벨 목록' 유형의 attr_name 속성에 지정된 타겟 집합을 반환합니다.
예를 들어 labels(srcs, //foo)
는 //foo
규칙의 srcs
속성에 표시되는 대상 집합을 반환합니다. inputs에 srcs
속성이 있는 규칙이 여러 개 있는 경우 srcs
의 합집합이 반환됩니다.
test_suites 확장 및 필터링: 테스트
expr ::= tests(expr)
tests(x)
연산자는 x 집합의 모든 테스트 규칙 집합을 반환하고, test_suite
규칙을 참조하는 개별 테스트 집합으로 확장하고, tag
및 size
로 필터링을 적용합니다.
기본적으로 쿼리 평가는 모든 test_suite
규칙의 테스트 이외의 대상을 무시합니다. --strict_test_suite
옵션을 사용하여 오류로 변경할 수 있습니다.
예를 들어 kind(test, foo:*)
쿼리는 foo
패키지의 모든 *_test
및 test_suite
규칙을 나열합니다. 모든 결과는 정의에 따라 foo
패키지의 멤버입니다. 반면에 tests(foo:*)
쿼리는 bazel test
foo:*
에서 실행할 모든 개별 테스트를 반환합니다. 여기에는 test_suite
규칙을 통해 직간접적으로 참조되는 다른 패키지에 속하는 테스트가 포함될 수 있습니다.
패키지 정의 파일: buildfiles
expr ::= buildfiles(expr)
buildfiles(x)
연산자는 x 집합에서 각 타겟의 패키지를 정의하는 파일 집합을 반환합니다. 즉, 각 패키지에 대해 BUILD
파일과 load
를 통해 참조하는 모든 .bzl 파일을 반환합니다. 이렇게 하면 load
된 파일이 포함된 패키지의 BUILD
파일도 반환됩니다.
이 연산자는 일반적으로 지정된 타겟을 빌드하는 데 필요한 파일 또는 패키지를 결정할 때 사용되며, 보통 아래의 --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
타겟과 //bar:file.bzl
를 로드하는 다른 BUILD
파일의 타겟을 반환합니다.
--universe_scope
플래그로 지정된 세계입니다. BUILD
파일 및 .bzl
파일과 직접 일치하지 않는 파일은 결과에 영향을 주지 않습니다. 예를 들어 foo.cc
과 같은 소스 파일은 BUILD
파일에 명시적으로 언급되더라도 무시됩니다. 하지만 심볼릭 링크가 고려되므로 foo/BUILD
가 bar/BUILD
의 심볼릭 링크인 경우 rbuildfiles(bar/BUILD)
는 결과에 //foo:BUILD
를 포함합니다.
rbuildfiles
연산자는 buildfiles
연산자와 거의 비슷합니다. 그러나 이 도덕 역전은 한 방향으로 더 강하게 유지됩니다. rbuildfiles
의 출력은 buildfiles
의 입력과 같습니다. 전자의 경우 패키지에 BUILD
파일 타겟만 포함되고 후자의 경우 이러한 타겟을 포함할 수 있습니다. 다른 방향에서는 서신이 약합니다. buildfiles
연산자의 출력은 모든 패키지 및 .지정된 입력에 필요한 bzl
파일입니다. 그러나 rbuildfiles
연산자의 입력은 이러한 타겟이 아니라 해당 타겟에 해당하는 경로 프래그먼트입니다.
패키지 정의 파일: loadfiles
expr ::= loadfiles(expr)
loadfiles(x)
연산자는 집합 x에서 각 대상의 패키지를 로드하는 데 필요한 Starlark 파일 집합을 반환합니다. 즉, 각 패키지에 대해 BUILD
파일에서 참조된 .bzl 파일을 반환합니다.
출력 형식
bazel query
는 그래프를 생성합니다.
bazel query
에서 --output
명령줄 옵션을 사용하여 이 그래프를 표시하는 콘텐츠, 형식, 순서를 지정합니다.
Sky Query로 실행하는 경우 정렬되지 않은 출력과 호환되는 출력 형식만 허용됩니다. 특히 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
중 하나인 경우 출력이 임의의 순서로 출력됩니다. 일반적으로 가장 빠른 옵션입니다. 하지만 --output
가 graph
, minrank
또는 maxrank
중 하나인 경우 지원되지 않습니다. 이러한 형식을 사용하면 Bazel이 항상 종속 항목 순서 또는 순위에 따라 정렬된 결과를 출력합니다.
이 플래그가 deps
이면 Bazel은 결과를 일부 토폴로지 순서(종속 항목부터)로 출력합니다. 그러나 종속 항목 순서에 따라 순서가 지정되지 않은 노드(한 쪽에서 다른 쪽으로의 경로가 없음)는 어떤 순서로든 출력될 수 있습니다.
이 플래그가 full
이면 Bazel이 완전히 확정적인 (총) 순서로 노드를 출력합니다.
먼저 모든 노드가 알파벳순으로 정렬됩니다. 그런 다음 목록의 각 노드가 후속 노드 방문의 시작 부분으로 사용되며, 여기에서 방문되지 않은 노드의 발신 에지가 후속 노드의 알파벳순으로 순회됩니다. 마지막으로 노드는 방문 순서와 반대로 출력됩니다.
이 순서로 노드를 인쇄하면 속도가 느려질 수 있으므로 확정성이 중요한 경우에만 사용해야 합니다.
BUILD에 표시될 대상의 소스 양식을 출력합니다.
--output build
이 옵션을 사용하면 각 대상이 BUILD 언어로 직접 작성된 것처럼 표현됩니다. 모든 변수와 함수 호출(예: glob, 매크로)이 확장되므로 Starlark 매크로의 효과를 확인하는 데 유용합니다. 또한 각 유효 규칙은 generator_name
또는 generator_function
) 값을 보고하며 유효한 규칙을 생성하기 위해 평가된 매크로의 이름을 제공합니다.
출력에는 BUILD
파일과 동일한 구문이 사용되지만 유효한 BUILD
파일이 생성되지 않을 수도 있습니다.
각 대상의 라벨 인쇄
--output label
이 옵션을 사용하면 결과 그래프의 각 대상 이름 (또는 라벨) 집합이 토폴로지 순서대로 한 줄에 하나씩 출력됩니다 (--noorder_results
가 지정되지 않은 경우 결과 순서 지정 참고사항 참고).
토폴로지 순서 지정은 그래프 노드가 모든 후속 항목보다 먼저 나타나는 순서를 나타냅니다. 물론 그래프에는 여러 가지 위상 정렬이 있을 수 있으며 (역순 정렬은 그중 하나임) 어느 것이 선택되는지 지정되지 않습니다.
somepath
쿼리의 출력을 인쇄할 때 노드가 출력되는 순서는 경로의 순서입니다.
주의: 일부 특수한 경우에 라벨이 동일한 개별 대상이 두 개 있을 수 있습니다. 예를 들어 sh_binary
규칙과 그 규칙의 유일한 (암시적) srcs
파일은 모두 foo.sh
일 수 있습니다. 쿼리 결과에 이 두 대상이 모두 포함된 경우 label
형식의 출력에 중복이 포함된 것으로 표시됩니다. label_kind
(아래 참고) 형식을 사용하면 구분이 명확해집니다. 두 대상은 이름은 동일하지만 하나는 종류가 sh_binary rule
이고 다른 하나는 source file
종류입니다.
각 대상의 라벨 및 종류를 인쇄합니다.
--output label_kind
label
와 마찬가지로 이 출력 형식은 결과 그래프에 각 대상의 라벨을 토폴로지 순서로 출력하지만 추가로 대상의 종류가 라벨 앞에 옵니다.
각 타겟의 라벨을 순서대로 출력합니다.
--output minrank --output maxrank
label
와 마찬가지로 minrank
및 maxrank
출력 형식은 결과 그래프에서 각 대상의 라벨을 출력하지만 토폴로지 순서로 표시되지 않고 순위 순서 앞에 순위 번호로 표시됩니다. 이는 결과 정렬 --[no]order_results
플래그의 영향을 받지 않습니다 (결과 순서 지정에 관한 참고 사항 참고).
이 형식에는 두 가지 변형이 있습니다. minrank
는 루트 노드에서 최단 거리까지의 최단 경로 길이에 따라 각 노드의 순위를 지정합니다.
'루트' 노드 (수신 에지가 없는 노드)는 순위가 0이고, 후속 노드는 순위가 1 등입니다. 항상 그렇듯이 가장자리는 대상에서 전제 조건(즉, 종속되는 대상)을 가리킵니다.
maxrank
는 루트 노드에서 최장 경로까지의 길이에 따라 각 노드의 순위를 지정합니다. 다시 한번 말하지만, 'roots'의 순위는 0이고 다른 모든 노드의 순위는 모든 이전 노드의 최대 순위보다 높습니다.
주기의 모든 노드는 동일한 순위로 간주됩니다. (대부분의 그래프는 비순환식이지만 주기는 단순히 BUILD
파일에 잘못된 주기가 포함되어 있기 때문에 발생합니다.)
이러한 출력 형식은 그래프의 깊이를 파악하는 데 유용합니다. deps(x)
, rdeps(x)
또는 allpaths
쿼리 결과에 사용되는 경우 순위 번호는 x
에서 해당 순위의 노드까지의 최단 경로 (minrank
) 또는 최장 경로(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' 종속 항목 그래프로 사용할 수 있습니다.
위치 정보는 대상 종류에 따라 다릅니다 (kind 연산자 참고). 규칙의 경우 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
규칙은 모두 동일한 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-input
및 rule-output
요소가 포함되므로 srcs
속성의 요소가 순방향 종속 항목(기본 요건)이고 outs
속성의 내용이 역방향 종속 항목이라는 것을 알 필요 없이 종속 항목 그래프의 토폴로지를 재구성할 수 있습니다.
--noimplicit_deps
가 지정되면 암시적 종속 항목의 rule-input
요소가 표시되지 않습니다.
<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
속성 및 --output location
에 의해 출력된 타겟 위치인 location
속성이 포함되어 있습니다.
--[no]xml:line_numbers
기본적으로 XML 출력에 표시되는 줄에는 줄 번호가 포함됩니다.
--noxml:line_numbers
를 지정하면 줄 번호가 출력되지 않습니다.
--[no]xml:default_values
기본적으로 XML 출력에는 값이 이러한 종류의 속성의 기본값인 규칙 속성이 포함되지 않습니다 (예: BUILD
파일에 지정되지 않았거나 기본값이 명시적으로 제공된 경우). 이 옵션을 사용하면 이러한 속성 값이 XML 출력에 포함됩니다.
정규 표현식
쿼리 언어의 정규 표현식은 자바 정규식 라이브러리를 사용하므로 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