BazelCon 2022 16-17 নভেম্বর নিউ ইয়র্ক এবং অনলাইনে আসছে।
নিবন্ধন আজ!

Bazel ক্যোয়ারী কিভাবে-টু

সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।

এই পৃষ্ঠাটি আপনার কোডে নির্ভরতা ট্রেস করতে Bazel-এর ক্যোয়ারী ভাষা ব্যবহার করে কীভাবে শুরু করবেন তা কভার করে।

একটি ভাষার বিবরণ এবং --output পতাকার বিশদ বিবরণের জন্য, অনুগ্রহ করে রেফারেন্স ম্যানুয়াল, Bazel ক্যোয়ারী রেফারেন্স এবং Bazel cquery রেফারেন্স দেখুন । আপনি কমান্ড লাইনে bazel bazel help query বা bazel help cquery টাইপ করে সাহায্য পেতে পারেন।

অনুপস্থিত লক্ষ্যগুলির মতো ত্রুটিগুলি উপেক্ষা করার সময় একটি প্রশ্ন চালানোর জন্য, --keep_going পতাকা ব্যবহার করুন।

একটি নিয়মের নির্ভরতা খুঁজে বের করা

//foo এর নির্ভরতা দেখতে, bazel ক্যোয়ারীতে deps ফাংশন ব্যবহার করুন:

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

এটি //foo নির্মাণের জন্য প্রয়োজনীয় সমস্ত লক্ষ্যগুলির সেট।

দুটি প্যাকেজের মধ্যে নির্ভরতা চেইন ট্রেসিং

লাইব্রেরি //third_party/zlib:zlibonly //foo জন্য BUILD ফাইলে নেই, কিন্তু এটি একটি পরোক্ষ নির্ভরতা। কিভাবে আমরা এই নির্ভরতা পথ ট্রেস করতে পারি? এখানে দুটি দরকারী ফাংশন আছে: 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 foo-এর জন্য BUILD ফাইলটি কখনই //translations/tools:aggregator উল্লেখ করে না। তাহলে, সরাসরি নির্ভরতা কোথায়?

কিছু নিয়মের মধ্যে অতিরিক্ত লাইব্রেরি বা টুলের অন্তর্নিহিত নির্ভরতা অন্তর্ভুক্ত। উদাহরণস্বরূপ, একটি genproto নিয়ম তৈরি করতে, আপনাকে প্রথমে প্রোটোকল কম্পাইলার তৈরি করতে হবে, তাই প্রতিটি genproto নিয়ম প্রোটোকল কম্পাইলারের উপর একটি অন্তর্নিহিত নির্ভরতা বহন করে। এই নির্ভরতাগুলি বিল্ড ফাইলে উল্লেখ করা হয়নি, তবে বিল্ড টুল দ্বারা যোগ করা হয়েছে। অন্তর্নিহিত নির্ভরতার সম্পূর্ণ সেটটি বর্তমানে নথিভুক্ত নয়। --noimplicit_deps ব্যবহার করে আপনি আপনার প্রশ্নের ফলাফল থেকে এই --noimplicit_deps ফিল্টার করতে পারবেন। cquery-এর জন্য, এতে সমাধান করা টুলচেন অন্তর্ভুক্ত থাকবে।

বিপরীত নির্ভরতা

আপনি কিছু লক্ষ্যের উপর নির্ভর করে এমন লক্ষ্যগুলির সেট জানতে চাইতে পারেন। উদাহরণস্বরূপ, আপনি যদি কিছু কোড পরিবর্তন করতে যাচ্ছেন, আপনি অন্য কোন কোডটি ভাঙতে চলেছেন তা জানতে চাইতে পারেন। আপনি rdeps(u, x) ব্যবহার করতে পারেন 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

কোন নিয়ম নির্ভরতা বিদ্যমান ...

বার কোন genproto নিয়মের উপর নির্ভর করে?

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

কিছু JNI (C++) লাইব্রেরির সংজ্ঞা খুঁজুন যা সার্লেট ট্রিতে জাভা বাইনারি নিয়মের উপর নির্ভরশীল।

bazel query 'some(kind(cc_.*library, deps(kind(java_binary, //java/com/example/frontend/...))))' --output location
...এখন তাদের উপর নির্ভরশীল সমস্ত জাভা বাইনারিগুলির সংজ্ঞা খুঁজুন
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 নির্মাণের জন্য প্রয়োজনীয় জাভা সোর্স ফাইলের সম্পূর্ণ সেট কি?

সোর্স ফাইল:

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 এর পরীক্ষাগুলি তৈরি করার জন্য জাভা সোর্স ফাইলগুলির সম্পূর্ণ সেট কী?

সোর্স ফাইল:

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 পরীক্ষাগুলি নির্ভর করে যে //foo উত্পাদন বাইনারি নির্ভর করে না ?

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

কেন এই নির্ভরতা বিদ্যমান ...

কেন bar গ্রুপ 2 এর উপর 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 এর পাথ রয়েছে যা এই বিল্ডে অবশ্যই ঘটতে হবে।