क्वेरी गाइड

समस्या की शिकायत करें सोर्स देखें

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

भाषा और --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 बनाने के लिए ज़रूरी सभी टारगेट का सेट है.

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

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

सभी डिपेंडेंसी का ग्राफ़ देखने के लिए, dot कमांड लाइन टूल की मदद से, bazel क्वेरी के आउटपुट को पाइप करें:

$ 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

अगर आपने --output graph को allpaths के साथ नहीं तय किया, तो आपको डिपेंडेंसी ग्राफ़ की फ़्लैट की गई सूची मिलेगी.

$ 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 के लिए बिल्ड फ़ाइल कभी भी //translations/tools:aggregator का रेफ़रंस नहीं देती. तो, डायरेक्ट डिपेंडेंसी कहां है?

कुछ नियमों में, अतिरिक्त लाइब्रेरी या टूल की इंप्लिसिट डिपेंडेंसी शामिल होती है. उदाहरण के लिए, genproto नियम बनाने के लिए, पहले आपको प्रोटोकॉल कंपाइलर बनाना होगा. इससे हर genproto नियम, प्रोटोकॉल कंपाइलर पर पूरी तरह से निर्भर होता है. इन डिपेंडेंसी के बारे में बिल्ड फ़ाइल में नहीं बताया गया है, बल्कि बिल्ड टूल में इन्हें जोड़ा गया है. इंप्लिसिट डिपेंडेंसी के पूरे सेट के लिए, फ़िलहाल कोई दस्तावेज़ मौजूद नहीं है. --noimplicit_deps का इस्तेमाल करके, इन डिपों को अपनी क्वेरी के नतीजों से फ़िल्टर किया जा सकता है. cquery में, इसमें ऐसे टूलचेन शामिल होंगे जिनका समाधान किया जा चुका है.

डिपेंडेंसी उलटें

शायद आप कुछ टारगेट पर निर्भर टारगेट के सेट के बारे में जानना चाहें. उदाहरण के लिए, अगर आप कोई कोड बदलने जा रहे हैं, तो शायद आप यह जानना चाहें कि दूसरे कौनसे कोड को तोड़ने वाले हैं. u के ट्रांज़िशन के दौरान, x में टारगेट की रिवर्स डिपेंडेंसी जानने के लिए rdeps(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:*)'

स्टारलार्क मैक्रो 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/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)'

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

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 (a 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 से लेकर हर y तक, सबसे लंबे पाथ की लंबाई भी दिखा सकती है. maxrank का इस्तेमाल करें:

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

नतीजे से पता चलता है कि लंबाई 85 वाले पाथ मौजूद हैं, जो इस बिल्ड के क्रम में होने चाहिए.