इस पेज में बताया गया है कि ट्रेस करने के लिए Baज़र की क्वेरी लैंग्वेज का इस्तेमाल कैसे शुरू करें डिपेंडेंसी से तय करें.
भाषा और --output
फ़्लैग की जानकारी के लिए, कृपया यह देखें
रेफ़रंस मैन्युअल, बेज़ल क्वेरी रेफ़रंस
और 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
अगर आप --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 के लिए, इसमें रिज़ॉल्व किए गए टूलचेन शामिल होंगे.
डिपेंडेंसी बदलना
ऐसा हो सकता है कि आप किसी टारगेट पर आधारित टारगेट के सेट के बारे में जानना चाहें. उदाहरण के लिए,
अगर आपको कोई दूसरा कोड बदलना है, तो
आप तोड़ने वाले हैं. rdeps(u, x)
का इस्तेमाल करके,
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 तक, लेकिन यह
शुरुआती पॉइंट या आपको x से हर
अच्छा है कि यह इस पर निर्भर है. maxrank
का इस्तेमाल करें:
bazel query 'deps(//foo-tests)' --output maxrank | tail -1 85 //third_party/zlib:zutil.c
नतीजा बताता है कि लंबाई 85 के ऐसे पाथ मौजूद हैं जो ऑर्डर बना रहे हैं.