क्वेरी गाइड

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

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

भाषा की जानकारी और --output फ़्लैग की जानकारी के लिए, कृपया रेफ़रंस गाइड, Bazu क्वेरी का रेफ़रंस, और Baze cquery का रेफ़रंस देखें. मदद पाने के लिए, 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 की बिल्ड फ़ाइल कभी भी //translations/tools:aggregator का रेफ़रंस नहीं देती है. तो, डायरेक्ट डिपेंडेंसी कहां है?

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

डिपेंडेंसी बदलना

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

बेज़ल की स्काई क्वेरी, 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 (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 के पाथ मौजूद हैं, जो इस बिल्ड में एक क्रम में होने चाहिए.