نحوه پرس و جو بازل

این صفحه نحوه شروع استفاده از زبان پرس و جو Bazel را برای ردیابی وابستگی ها در کد را پوشش می دهد.

برای جزئیات زبان و جزئیات پرچم خروجی، لطفاً به راهنمای مرجع، مرجع جستجوی Bazel و مرجع --output Bazel مراجعه کنید. با تایپ bazel help query یا bazel help cquery در خط فرمان می توانید کمک بگیرید.

برای اجرای یک پرس و جو در حالی که خطاهایی مانند اهداف از دست رفته را نادیده می گیرید، از پرچم --keep_going استفاده کنید.

پیدا کردن وابستگی های یک قانون

برای مشاهده وابستگی های //foo ، از تابع deps در query bazel استفاده کنید:

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

این مجموعه تمام اهداف مورد نیاز برای ساخت //foo است.

ردیابی زنجیره وابستگی بین دو بسته

کتابخانه //third_party/zlib:zlibonly در فایل BUILD برای //foo نیست، اما یک وابستگی غیرمستقیم است. چگونه می توانیم این مسیر وابستگی را دنبال کنیم؟ در اینجا دو تابع مفید وجود دارد: allpaths و somepath . همچنین ممکن است بخواهید وابستگی‌های ابزارسازی را با --notool_deps کنید، اگر فقط به آنچه در مصنوع ساخته شده‌تان وجود دارد و نه هر کار ممکن اهمیت می‌دهید.

برای تجسم نمودار تمام وابستگی ها، خروجی پرس و جو bazel را از طریق ابزار خط فرمان 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

کنار: وابستگی های ضمنی

فایل BUILD برای //foo هرگز به //translations/tools:aggregator اشاره نمی کند. بنابراین، وابستگی مستقیم کجاست؟

برخی از قوانین شامل وابستگی های ضمنی به کتابخانه ها یا ابزارهای اضافی هستند. به عنوان مثال، برای ایجاد یک قانون genproto ، ابتدا باید Protocol Compiler را بسازید، بنابراین هر قانون genproto وابستگی ضمنی به کامپایلر پروتکل دارد. این وابستگی ها در فایل ساخت ذکر نشده اند، اما توسط ابزار ساخت اضافه شده اند. مجموعه کامل وابستگی های ضمنی در حال حاضر مستند نشده است. استفاده از --noimplicit_deps به شما این امکان را می دهد که این دپ ها را از نتایج جستجوی خود فیلتر کنید. برای جستجو، این شامل زنجیره های ابزار حل شده می شود.

وابستگی های معکوس

ممکن است بخواهید مجموعه ای از اهداف را بدانید که به هدفی بستگی دارد. به عنوان مثال، اگر می‌خواهید برخی از کدها را تغییر دهید، ممکن است بخواهید بدانید چه کد دیگری را می‌خواهید بشکنید. می‌توانید از rdeps(u, x) برای یافتن وابستگی‌های معکوس اهداف در x در بسته شدن انتقالی u استفاده کنید.

Bazel's 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 macro foo ایجاد می شود؟

bazel query 'attr(generator_function, foo, //path/to/search/...)'

مجموعه فایل های BUILD مورد نیاز برای ساخت //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/...))'

این الگو یک regex است و برای نام کامل قانون اعمال می شود. شبیه انجام دادن است

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 به چه بسته هایی بستگی دارد، به استثنای foo/contrib ؟

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 به چه کتابخانه‌های 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 وجود دارد که باید به ترتیب در این ساخت رخ دهند.