बेज़ेल क्वेरी कैसे करें

इस पेज में बताया गया है कि कैसे आप अपने कोड में डिपेंडेंसी जानने के लिए, Bazel की क्वेरी भाषा का इस्तेमाल शुरू करें.

भाषा की जानकारी और --output फ़्लैग की जानकारी के लिए, कृपया पहचान फ़ाइल का मैन्युअल, बज़ेल क्वेरी संदर्भ, और बज़ेल क्वेरी संदर्भ देखें. आप कमांड लाइन पर bazel help query या bazel help cquery टाइप करके मदद पा सकते हैं.

छूटे हुए टारगेट जैसी गड़बड़ियों को अनदेखा करते हुए की गई क्वेरी लागू करने के लिए, --keep_going फ़्लैग का इस्तेमाल करें.

किसी नियम पर निर्भरता का पता लगाना

//foo पर निर्भरता देखने के लिए बैजल क्वेरी में deps फ़ंक्शन का इस्तेमाल करें:

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

यह //foo बनाने के लिए ज़रूरी सभी टारगेट का सेट है.

दो पैकेज के बीच के डिपेंडेंसी चेन को ट्रेस करना

//third_party/zlib:zlibonly लाइब्रेरी, //foo के लिए बिल्ड फ़ाइल में नहीं है, लेकिन यह सीधे तौर पर निर्भर नहीं है. हम इस डिपेंडेंसी पाथ को कैसे ट्रेस कर सकते हैं? यहां दो काम के फ़ंक्शन हैं: allpaths और somepath. आप यह भी चुन सकते हैं कि--notool_deps अगर आप सिर्फ़ इस बात की परवाह करते हैं कि आपने जो आर्टफ़ैक्ट बनाया है, उसमें क्या शामिल है, और वह हर काम नहीं कर रहा है.

सभी डिपेंडेंसी के ग्राफ़ को विज़ुअलाइज़ करने के लिए, 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 का इस्तेमाल करके, आप क्वेरी के नतीजों से इन नतीजों को फ़िल्टर कर सकते हैं. क्वेरी के लिए, इसमें समाधान किए गए टूलचेन शामिल होंगे.

दूसरी चीज़ों पर निर्भर करता है

हो सकता है कि आप टारगेट के उस सेट के बारे में जानना चाहें जो कुछ टारगेट पर निर्भर करता है. उदाहरण के लिए, अगर आप कुछ कोड बदलने वाले हैं, तो हो सकता है कि आप यह जानना चाहें कि आप दूसरा कौनसा कोड लेने वाले हैं. आप rdeps(u, x) का इस्तेमाल करके x में, टारगेट के रिवर्स डिपेंडेंसी पता कर सकते हैं. इसके लिए, u को कुछ समय के लिए बंद किया जाएगा.

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 बनाने के लिए बिल्ड फ़ाइलों का सेट क्या है?

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/contrib को छोड़कर, foo ट्री किन पैकेज पर निर्भर करता है?

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

कौनसे नियम डिपेंडेंसी मौजूद हैं ...

बार किस जीनोप्रोटो नियम पर निर्भर करता है?

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

कुछ JNI (C++) लाइब्रेरी की परिभाषा जानें, जो सर्वलेट ट्री में कुछ समय के लिए Java बाइनरी नियम के आधार पर निर्भर करती है.

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)'

कौनसे फ़ाइल डिपेंडेंसी मौजूद हैं ...

फ़ू बनाने के लिए 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 के दो वैरिएंट पर क्यों निर्भर है?

यह क्वेरी नीचे दी गई है: "मुझे //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 वर्णों का पाथ मौजूद है, जो इस बिल्ड के क्रम में होना चाहिए.