คู่มือการค้นหา

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้จะพูดถึงวิธีเริ่มต้นใช้งานภาษาการค้นหาของ Bazel เพื่อติดตาม ในโค้ดของคุณ

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

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

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

หากต้องการดูทรัพยากร Dependency ของ //foo ให้ใช้ ฟังก์ชัน deps ในการค้นหาแบบ Bazel:

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

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

การติดตามห่วงโซ่ทรัพยากร Dependency ระหว่าง 2 แพ็กเกจ

ไลบรารี //third_party/zlib:zlibonly ไม่ได้อยู่ในไฟล์ BUILD สำหรับ //foo แต่เป็นทรัพยากร Dependency โดยอ้อม จะทำอย่างไร เราติดตามเส้นทางการขึ้นต่อกันนี้ได้อย่างไร ฟังก์ชันนี้มี 2 ฟังก์ชันที่เป็นประโยชน์ดังนี้ allpaths และ somepath และคุณอาจต้องยกเว้น การใช้เครื่องมือ Dependency ด้วย --notool_deps หากคุณสนใจเฉพาะ สิ่งที่รวมอยู่ในอาร์ติแฟกต์ที่คุณสร้างขึ้น และก็ไม่ใช่งานที่เป็นไปได้ทั้งหมด

เพื่อให้เห็นภาพกราฟของทรัพยากร Dependency ทั้งหมด ให้เชื่อมโยงเอาต์พุตของการค้นหา Bazel ด้วย เครื่องมือบรรทัดคำสั่ง dot:

$ bazel query "allpaths(//foo, third_party/...)" --notool_deps --output graph | dot -Tsvg > /tmp/deps.svg

เมื่อกราฟทรัพยากร Dependency มีขนาดใหญ่และซับซ้อน การเริ่มต้นด้วยเส้นทางเดียวก็อาจมีประโยชน์ดังนี้

$ 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 คุณจะเห็นรายการกราฟทรัพยากร Dependency ที่แบ่งออกเป็นหลายรายการ

$ 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 ทุกกฎจะมีทรัพยากร Dependency แบบโดยนัย คอมไพเลอร์โปรโตคอล ทรัพยากร Dependency เหล่านี้ไม่ได้ระบุไว้ในไฟล์บิลด์ แต่เพิ่มเข้ามาโดยเครื่องมือสร้าง ทรัพยากร Dependency โดยนัยครบชุดคือ ยังไม่มีการบันทึกในขณะนี้ การใช้ --noimplicit_deps จะช่วยให้คุณสามารถกรอง Dependency เหล่านี้จากผลการค้นหา สำหรับ cquery ระบบจะรวม Toolchain ที่มีการแก้ปัญหาไว้ด้วย

การขึ้นต่อกันแบบย้อนกลับ

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

Sky Query ของ Bazel รองรับฟังก์ชัน allrdeps ซึ่งช่วยให้คุณค้นหาการอ้างอิงแบบย้อนกลับได้ ในจักรวาลที่คุณระบุ

การใช้งานเบ็ดเตล็ด

คุณใช้ bazel query เพื่อวิเคราะห์ความสัมพันธ์ของทรัพยากร Dependency ได้หลายรายการ

สิ่งที่มีอยู่ ...

มีแพ็กเกจใดอยู่ใต้ 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//:*/}:*)"

ทรัพยากร Dependency ของแพ็กเกจมีอะไรบ้าง ...

foo ใช้แพ็กเกจใด (ฉันต้องชำระเงินอะไรบ้างเพื่อสร้าง foo)

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

แผนผัง foo อ้างอิงแพ็กเกจใด ยกเว้น foo/contrib

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

ทรัพยากร Dependency ของกฎใดมีอยู่ ...

แถบอ้างอิงกฎ Genprof ในข้อใด

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

เหตุใดจึงมีทรัพยากร Dependency นี้ ...

ทำไม 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 จึงต้องใช้ตัวแปร 2 ตัวของไลบรารีเดียวกัน //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)'

ฉันจะหยุดทรัพยากร Dependency ได้อย่างไร ...

ฉันต้องแยกเส้นทางทรัพยากร Dependency ใดเพื่อให้ bar ไม่ใช้ X อีกต่อไป

วิธีเอาต์พุตกราฟเป็นไฟล์ svg

bazel query 'allpaths(bar/...,X)' --output graph | dot -Tsvg > /tmp/dep.svg

อื่นๆ

บิลด์ //foo-tests มีขั้นตอนตามลำดับกี่ขั้นตอน

ขออภัย ปัจจุบันข้อความค้นหาไม่สามารถให้เส้นทางที่ยาวที่สุดแก่คุณได้ จาก x ถึง y แต่สามารถค้นหาโหนด (หรือ a) ที่อยู่ไกลที่สุดจากโหนด จุดเริ่มต้น หรือแสดงความยาวของเส้นทางที่ยาวที่สุดจาก x ถึงทุกๆ แล้วแต่กรณี ใช้ maxrank:

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

ผลลัพธ์ระบุว่ามีเส้นทางที่มีความยาว 85 ซึ่งต้องเกิดขึ้นใน เพื่อเรียงลำดับในบิลด์นี้