Bazel 查詢操作說明

回報問題 查看原始碼 。 。 。 。 夜間。 。 7.3 。 。 7.2 。 。 7.1 。 。 7.0 。 。 6.5

本頁面說明如何開始使用 Bazel 的查詢語言進行追蹤 依附元件

如需語言詳細資料和--output檢舉詳細資料,請參閱 參考手冊、Bazel 查詢參考資料Bazel cquery 參考資料。你可以透過以下方式取得協助: 請在鍵盤上輸入 bazel help querybazel help cquery 指令列

如要在略過目標 (例如缺少目標) 時執行查詢,請使用 --keep_going 標記。

尋找規則的依附元件

如要查看 //foo 的依附元件,請使用 bazel 查詢中的 deps 函式:

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

這些是建構 //foo 所需的所有目標組合。

追蹤兩個套件之間的依附元件鏈結

BUILD 檔案中沒有 //third_party/zlib:zlibonly 程式庫 //foo,但為間接依附元件。做法 我們要追蹤這個依附關係路徑嗎?這裡有兩個實用的函式: 《allpaths》和《somepath》。另外,建議你一併排除 只想在使用 --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 可讓您篩除 這些最低點以 cquery 來說,這將包含已解析的工具鍊。

反轉依附元件

您可能想知道一組取決於某些目標的指定目標。舉例來說: 若您想要更改某些程式碼,您可能會想得知 即將打破您可以使用 rdeps(u, x) 找出相反詞 在 u 的遞移封閉內,x 中的目標依附元件。

Bazel 的 Sky 查詢 支援 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/...))'

這個模式為規則運算式,適用於規則的完整名稱。與執行模型類似

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 樹狀結構依附哪些套件 (foo/contrib 除外)?

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

有哪些規則依附關係 ...

長條取決於哪個 Genproto 規則?

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

尋找某些 JNI (C++) 程式庫的定義,這些 JNI 程式庫由 Java 二進位檔規則間接依附在 WhatsApp 樹狀結構中。

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 測試的 C++ 程式庫是否依附於 //foo 正式版二進位檔「並非」依附?

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

為什麼有這個依附元件 ...

為什麼 bar 依附 groups2

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 的兩個變化版本?

這個查詢總結為「Show me the //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 版本包含幾個連續步驟?

很抱歉,目前查詢語言目前無法提供最長的路徑 從 x 到 y,但可以找出最遙遠的節點 (或是 a) 也可以顯示從 x 到每一步之間最長路徑的長度 也視情況而定使用 maxrank

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

結果指出,必須發生長度 85 的路徑, 編碼器-解碼器架構