วิธีการค้นหาข้อมูล Bazel

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้จะอธิบายวิธีเริ่มต้นใช้งานภาษาการค้นหาของ Bazel เพื่อติดตามข้อกําหนดในโค้ด

ดูรายละเอียดภาษาและรายละเอียด Flag --output ได้ที่คู่มืออ้างอิง ข้อมูลอ้างอิงสำหรับคําค้นหาของ Bazel และข้อมูลอ้างอิงสำหรับ cquery ของ Bazel คุณสามารถรับความช่วยเหลือได้โดยพิมพ์ bazel help query หรือ bazel help cquery ในบรรทัดคำสั่ง

หากต้องการเรียกใช้การค้นหาโดยไม่สนใจข้อผิดพลาด เช่น ไม่มีเป้าหมาย ให้ใช้แฟล็ก --keep_going

การค้นหาทรัพยากร Dependency ของกฎ

หากต้องการดูรายการที่ //foo อ้างอิง ให้ใช้ฟังก์ชัน deps ใน Bazel Query ดังนี้

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

นี่คือชุดเป้าหมายทั้งหมดที่จําเป็นสําหรับการสร้าง //foo

การติดตามเชนการพึ่งพาระหว่าง 2 แพ็กเกจ

ไลบรารี //third_party/zlib:zlibonly ไม่ได้อยู่ในไฟล์ BUILD ของ //foo แต่เป็น Dependency โดยอ้อม เราติดตามเส้นทางการพึ่งพานี้ได้อย่างไร ฟังก์ชันที่มีประโยชน์ 2 รายการ ได้แก่ 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

หมายเหตุ: ทรัพยากร Dependency โดยนัย

ไฟล์ BUILD สำหรับ //foo ไม่เคยอ้างอิง //translations/tools:aggregator Dependency โดยตรงอยู่ที่ไหน

กฎบางข้อมีการพึ่งพาโดยนัยในไลบรารีหรือเครื่องมือเพิ่มเติม เช่น หากต้องการสร้างกฎ genproto คุณต้องสร้างคอมไพเลอร์โปรโตคอลก่อน เพื่อให้กฎ genproto ทั้งหมดใช้คอมไพเลอร์โปรโตคอลโดยปริยาย ไฟล์บิลด์ไม่ได้กล่าวถึงการพึ่งพาเหล่านี้ แต่เครื่องมือสร้างจะเพิ่มเข้ามา ขณะนี้ยังไม่มีเอกสารประกอบเกี่ยวกับชุดพึ่งพาโดยนัยทั้งหมด การใช้ --noimplicit_deps ช่วยให้คุณกรอง deps เหล่านี้ออกจากผลการค้นหาได้ สำหรับ cquery ข้อมูลนี้จะรวมเครื่องมือทางเทคนิคที่แก้ไขแล้ว

ทรัพยากร Dependency แบบย้อนกลับ

คุณอาจต้องทราบชุดเป้าหมายที่ขึ้นอยู่กับเป้าหมายบางรายการ เช่น หากต้องการเปลี่ยนโค้ดบางอย่าง คุณอาจต้องทราบว่าโค้ดอื่นๆ ใดบ้างที่อาจได้รับผลกระทบ คุณสามารถใช้ rdeps(u, x) เพื่อค้นหาความสัมพันธ์แบบย้อนกลับของเป้าหมายใน x ภายในการปิดเชิงสื่อกลางของ u

Sky Query ของ Bazel รองรับฟังก์ชัน 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 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/...))'

รูปแบบคือนิพจน์ทั่วไปและจะใช้กับชื่อเต็มของกฎ ซึ่งคล้ายกับการดำเนินการ

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 ขึ้นอยู่กับแพ็กเกจใด (What do I need to check out to build foo)

bazel query 'buildfiles(deps(//foo:foo))' --output package

ต้นไม้ foo ขึ้นอยู่กับแพ็กเกจใดบ้าง ยกเว้น foo/contrib

bazel query 'deps(foo/... except foo/contrib/...)' --output package

What rule dependencies exist ...

bar ขึ้นอยู่กับกฎ genproto ใด

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)'

ไฟล์ใดบ้างที่ต้องใช้ร่วมกัน ...

ไฟล์ต้นฉบับ Java ชุดสมบูรณ์ที่จำเป็นต่อการสร้าง 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$

ไฟล์ต้นทาง 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$

ความแตกต่างของ Dependency ระหว่าง 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))'

Why does this dependency exist ...

Why does bar depend on groups2?

bazel query 'somepath(bar/...,groups2/...:*)'

เมื่อได้รับผลการค้นหานี้ คุณมักจะพบว่าเป้าหมายหนึ่งๆ โดดเด่นขึ้นมาในฐานะทรัพยากร bar ที่ไม่คาดคิด รุนแรง และไม่พึงประสงค์ จากนั้นปรับแต่งการค้นหาเพิ่มเติมเป็น

แสดงเส้นทางจาก docker/updater:updater_systest (py_test) ไปยัง cc_library บางรายการที่ docker/updater:updater_systest นั้นพึ่งพา

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 เดียวกัน 2 รูปแบบ

คําค้นหานี้สรุปได้ว่า "แสดงกราฟย่อยของ //photos/frontend:lib ที่ขึ้นอยู่กับทั้ง 2 ไลบรารี" เมื่อแสดงตามลําดับเชิงทอพอโลยี องค์ประกอบสุดท้ายของผลลัพธ์อาจเป็นสาเหตุที่เป็นไปได้มากที่สุด

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 ไปยัง y ทุกรายการที่ขึ้นอยู่กับโหนดนั้น วิธีใช้ maxrank

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

ผลลัพธ์บ่งชี้ว่ามีเส้นทางที่มีความยาว 85 ที่ต้องปรากฏตามลําดับในบิลด์นี้