Bazel 쿼리 방법

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

이 페이지에서는 Bazel의 쿼리 언어를 사용하여 trace를 추적하는 방법을 설명합니다. 종속 항목을 삭제할 수 있습니다

언어 세부정보 및 --output 플래그 세부정보는 다음을 참고하세요. 참조 설명서, Bazel 쿼리 참조Bazel cquery 참조를 참고하세요. 다음 방법으로 도움을 받으실 수 있습니다. bazel help query 또는 bazel help cquery 입력 살펴보겠습니다

대상 누락과 같은 오류를 무시하고 쿼리를 실행하려면 --keep_going 플래그.

규칙의 종속 항목 찾기

//foo의 종속 항목을 보려면 다음을 사용합니다. bazel 쿼리의 deps 함수:

$ bazel query "deps(//foo)"
//foo:foo
//foo:foo-dep
...

이는 //foo를 빌드하는 데 필요한 모든 타겟의 집합입니다.

두 패키지 간 종속 항목 체인 추적

//third_party/zlib:zlibonly 라이브러리가 BUILD 파일에 없음 //foo이지만 간접 종속 항목입니다. 어떻게 종속 항목 경로를 추적하는가? 여기에는 두 가지 유용한 함수가 있습니다. allpathssomepath. 또한 다음에만 관심이 있다면 --notool_deps로 도구 종속 항목을 사용할 수 있습니다. 빌드 아티팩트에 포함되어 있는 것이지 가능한 모든 작업이 아닙니다.

모든 종속 항목의 그래프를 시각화하려면 다음을 통해 bazel 쿼리 출력을 파이핑하세요. dot 명령줄 도구:

$ bazel query "allpaths(//foo, third_party/...)" --notool_deps --output graph | dot -Tsvg > /tmp/deps.svg

종속 항목 그래프가 크고 복잡한 경우 단일 경로로 시작하는 것이 유용할 수 있습니다.

$ bazel query "somepath(//foo:foo, third_party/zlib:zlibonly)"
//foo:foo
//translations/tools:translator
//translations/base:base
//third_party/py/MySQL:MySQL
//third_party/py/MySQL:_MySQL.so
//third_party/mysql:mysql
//third_party/zlib:zlibonly

allpaths--output graph를 지정하지 않으면 종속 항목 그래프의 평면화된 목록이 표시됩니다.

$ bazel query "allpaths(//foo, third_party/...)"
  ...many errors detected in BUILD files...
//foo:foo
//translations/tools:translator
//translations/tools:aggregator
//translations/base:base
//tools/pkg:pex
//tools/pkg:pex_phase_one
//tools/pkg:pex_lib
//third_party/python:python_lib
//translations/tools:messages
//third_party/py/xml:xml
//third_party/py/xml:utils/boolean.so
//third_party/py/xml:parsers/sgmlop.so
//third_party/py/xml:parsers/pyexpat.so
//third_party/py/MySQL:MySQL
//third_party/py/MySQL:_MySQL.so
//third_party/mysql:mysql
//third_party/openssl:openssl
//third_party/zlib:zlibonly
//third_party/zlib:zlibonly_v1_2_3
//third_party/python:headers
//third_party/openssl:crypto

참고: 암시적 종속 항목

//foo의 BUILD 파일은 참조하지 않음 //translations/tools:aggregator입니다. 그렇다면 직접적인 종속 항목은 어디에 있을까요?

특정 규칙에는 추가 라이브러리나 도구의 암시적 종속 항목이 포함됩니다. 예를 들어 genproto 규칙을 작성하려면 먼저 프로토콜을 빌드해야 합니다. 컴파일러, 따라서 모든 genproto 규칙은 프로토콜 컴파일러입니다 이러한 종속 항목은 빌드 파일에 언급되지 않습니다. 빌드 도구에 의해 추가됩니다. 암시적 종속 항목의 전체 집합은 있습니다. --noimplicit_deps를 사용하면 이 deps를 쿼리 결과에서 가져올 수 있습니다. cquery의 경우 확인된 도구 모음이 포함됩니다.

역 종속 항목

일부 타겟에 종속된 일련의 타겟이 궁금할 수 있습니다. 예를 들면 다음과 같습니다. 일부 코드를 변경할 경우 다른 코드가 어떤 것인지 곧 깨질 거야. rdeps(u, x)를 사용하여 역을 찾을 수 있습니다. u의 전이적 클로저 내에서 x에 있는 타겟의 종속 항목

Bazel의 Sky Query 역 종속 항목을 쿼리할 수 있는 allrdeps 함수를 지원합니다. 일할 수 있습니다.

기타 용도

bazel query를 사용하여 여러 종속 항목 관계를 분석할 수 있습니다.

존재하는 것 ...

foo 아래에 어떤 패키지가 있나요?

bazel query 'foo/...' --output package

foo 패키지에 정의된 규칙은 무엇인가요?

bazel query 'kind(rule, foo:*)' --output label_kind

foo 패키지의 규칙에 의해 생성되는 파일은 무엇인가요?

bazel query 'kind("generated file", //foo:*)'

Starlark 매크로 foo에 의해 어떤 타겟이 생성되나요?

bazel query 'attr(generator_function, foo, //path/to/search/...)'

//foo를 빌드하는 데 필요한 BUILD 파일 세트는 무엇인가요?

bazel query 'buildfiles(deps(//foo))' | cut -f1 -d:

test_suite가 확장되는 개별 테스트는 무엇인가요?

bazel query 'tests(//foo:smoke_tests)'

이 중 어떤 것이 C++ 테스트인가요?

bazel query 'kind(cc_.*, tests(//foo:smoke_tests))'

이 중에서 어떤 것이 작을까요? 중간인가요? 대규모?

bazel query 'attr(size, small, tests(//foo:smoke_tests))'

bazel query 'attr(size, medium, tests(//foo:smoke_tests))'

bazel query 'attr(size, large, tests(//foo:smoke_tests))'

패턴과 일치하는 foo 아래의 테스트는 무엇인가요?

bazel query 'filter("pa?t", kind(".*_test rule", //foo/...))'

패턴은 정규식이며 규칙의 전체 이름에 적용됩니다. Kubernetes에서

bazel query 'kind(".*_test rule", //foo/...)' | grep -E 'pa?t'

path/to/file/bar.java 파일이 포함된 패키지는 무엇인가요?

 bazel query path/to/file/bar.java --output=package

path/to/file/bar.java?의 빌드 라벨은 무엇인가요?

bazel query path/to/file/bar.java

path/to/file/bar.java 파일을 소스로 포함하는 규칙 대상은 무엇인가요?

fullname=$(bazel query path/to/file/bar.java)
bazel query "attr('srcs', $fullname, ${fullname//:*/}:*)"

패키지 종속 항목 존재

foo는 어떤 패키지에 종속되나요? (foo을(를) 빌드하려면 무엇을 확인해야 하나요?)

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

foo/contrib를 제외하고 foo 트리는 어떤 패키지에 종속되나요?

bazel query 'deps(foo/... except foo/contrib/...)' --output package

규칙 종속 항목

막대가 의존하는 genproto 규칙은 무엇인가요?

bazel query 'kind(genproto, deps(bar/...))'

서블릿 트리에서 Java 바이너리 규칙에 의해 전이적으로 의존하는 일부 JNI (C++) 라이브러리의 정의에 대해 알아보세요.

bazel query 'some(kind(cc_.*library, deps(kind(java_binary, //java/com/example/frontend/...))))' --output location
...이제 이 바이너리에 종속된 모든 Java 바이너리의 정의를 찾아봅니다.
bazel query 'let jbs = kind(java_binary, //java/com/example/frontend/...) in
  let cls = kind(cc_.*library, deps($jbs)) in
    $jbs intersect allpaths($jbs, $cls)'

파일의 종속 항목

foo를 빌드하는 데 필요한 완전한 Java 소스 파일 세트는 무엇인가요?

소스 파일:

bazel query 'kind("source file", deps(//path/to/target/foo/...))' | grep java$

생성된 파일:

bazel query 'kind("generated file", deps(//path/to/target/foo/...))' | grep java$

QUX 테스트를 빌드하는 데 필요한 전체 Java 소스 파일 세트는 무엇인가요?

소스 파일:

bazel query 'kind("source file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$

생성된 파일:

bazel query 'kind("generated file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$

X와 Y 간 종속 항목 간 차이점

//foo//foo:foolib가 종속되지 않는 타겟은 무엇인가요?

bazel query 'deps(//foo) except deps(//foo:foolib)'

//foo 프로덕션 바이너리에는 종속되지 않지만 foo 테스트는 어떤 C++ 라이브러리에 종속되나요?

bazel query 'kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo))'

이 종속 항목이 존재하는 이유는 무엇인가요?

bargroups2에 의존하는 이유는 무엇인가요?

bazel query 'somepath(bar/...,groups2/...:*)'

이 쿼리의 결과를 얻으면 단일 예상치 못했거나 매우 심각하거나 바람직하지 않은 것으로 확인됨 bar의 종속 항목입니다. 그러면 쿼리를 다음과 같이 더욱 세분화할 수 있습니다.

docker/updater:updater_systest (py_test)에서 종속되는 cc_library까지의 경로를 보여줍니다.

bazel query 'let cc = kind(cc_library, deps(docker/updater:updater_systest)) in
  somepath(docker/updater:updater_systest, $cc)'

//photos/frontend:lib 라이브러리가 동일한 //third_party/jpeglib//third_party/jpeg 라이브러리의 두 변형에 종속되는 이유는 무엇인가요?

이 쿼리는 다음과 같이 요약됩니다. '//photos/frontend:lib의 하위 그래프를 표시해 줘' 두 라이브러리에 모두 종속됩니다.'라는 오류가 표시될 수 있습니다. 위상 순서로 표시되는 경우 마지막 요소는 결과가 가장 큰 원인일 가능성이 높습니다.

bazel query 'allpaths(//photos/frontend:lib, //third_party/jpeglib)
                intersect
               allpaths(//photos/frontend:lib, //third_party/jpeg)'
//photos/frontend:lib
//photos/frontend:lib_impl
//photos/frontend:lib_dispatcher
//photos/frontend:icons
//photos/frontend/modules/gadgets:gadget_icon
//photos/thumbnailer:thumbnail_lib
//third_party/jpeg/img:renderer

다음 요소에 따라 달라집니다.

막대 아래의 어떤 규칙이 Y에 종속되나요?

bazel query 'bar/... intersect allpaths(bar/..., Y)'

T 패키지에서 T에 직접적으로 종속되는 타겟은 무엇인가요?

bazel query 'same_pkg_direct_rdeps(T)'

종속 항목을 해제하려면 어떻게 해야 하나요?

bar가 더 이상 X에 종속되지 않도록 하려면 어떤 종속 항목 경로를 중단해야 하나요?

그래프를 svg 파일로 출력하는 방법은 다음과 같습니다.

bazel query 'allpaths(bar/...,X)' --output graph | dot -Tsvg > /tmp/dep.svg

기타

//foo-tests 빌드에는 몇 개의 순차 단계가 있나요?

안타깝게도 쿼리 언어는 현재 최장 경로를 제공할 수 없습니다. 가장 멀리 떨어진 노드 (또는 그보다는 a)를 x에서 출발 지점까지의 최장 경로의 길이를 y로 바꾸면 됩니다. maxrank 사용:

bazel query 'deps(//foo-tests)' --output maxrank | tail -1
85 //third_party/zlib:zutil.c

결과는 다음에서 발생해야 하는 길이 85의 경로가 존재함을 나타냅니다. 살펴보겠습니다