หน้านี้คือคู่มืออ้างอิงสำหรับภาษาของคำค้นหา Bazel ที่ใช้เมื่อคุณใช้ bazel query
เพื่อวิเคราะห์ทรัพยากร Dependency ของบิลด์ ทั้งยังมีการอธิบายรูปแบบเอาต์พุตที่ bazel query
รองรับด้วย
ดูกรณีการใช้งานจริงได้ที่วิธีการค้นหาด้วย Bazel
ข้อมูลอ้างอิงการค้นหาเพิ่มเติม
นอกจาก query
ที่ทำงานในกราฟเป้าหมายระยะหลังการโหลดแล้ว Bazel ยังมีการค้นหากราฟการดำเนินการและการค้นหาที่กำหนดค่าได้
การค้นหากราฟการดำเนินการ
การค้นหากราฟการดำเนินการ (aquery
) จะทํางานกับกราฟเป้าหมายที่กําหนดค่าไว้หลังการวิเคราะห์ และแสดงข้อมูลเกี่ยวกับการดําเนินการ อาร์ติแฟกต์ และความสัมพันธ์ของสิ่งเหล่านี้ aquery
มีประโยชน์เมื่อคุณสนใจพร็อพเพอร์ตี้ของการดำเนินการ/อาร์ติแฟกต์ที่สร้างขึ้นจากกราฟเป้าหมายที่กำหนดค่าไว้
เช่น คำสั่งจริงที่เรียกใช้ รวมถึงอินพุต เอาต์พุต และกลวิธีช่วยจำ
ดูรายละเอียดเพิ่มเติมได้ที่ข้อมูลอ้างอิงการค้นหา
การค้นหาที่กําหนดค่าได้
การค้นหา Bazel แบบเดิมจะทำงานบนกราฟเป้าหมายหลังการโหลด จึงไม่มีแนวคิดของการกำหนดค่าและแนวคิดที่เกี่ยวข้อง สิ่งที่น่าสังเกตคือ เครื่องมือนี้ไม่ได้แก้ไขคำสั่ง Select อย่างถูกต้อง และแสดงผลลัพธ์ที่เป็นไปได้ทั้งหมดของ Select แทน อย่างไรก็ตาม สภาพแวดล้อมการค้นหาที่กำหนดค่าได้ cquery
จะจัดการการกำหนดค่าได้อย่างถูกต้อง แต่ไม่มีฟังก์ชันการทำงานทั้งหมดของการค้นหาดั้งเดิมนี้
ดูรายละเอียดเพิ่มเติมได้ที่ข้อมูลอ้างอิง BigQuery
ตัวอย่าง
ผู้คนใช้ bazel query
อย่างไร ตัวอย่างทั่วไปมีดังนี้
ทำไมต้นไม้ //foo
จึงขึ้นอยู่กับ //bar/baz
แสดงเส้นทาง
somepath(foo/..., //bar/baz:all)
การทดสอบ foo
ทั้งหมดไลบรารี C++ จะขึ้นอยู่กับว่าเป้าหมาย foo_bin
ไม่ได้ทำ
kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo:foo_bin))
โทเค็น: ไวยากรณ์คำศัพท์
นิพจน์ในภาษาที่ใช้ค้นหาประกอบด้วยโทเค็นต่อไปนี้
คีย์เวิร์ด เช่น
let
คีย์เวิร์ดคือคําที่สงวนไว้ของภาษา ซึ่งคําแต่ละคําจะอธิบายไว้ด้านล่าง ชุดคีย์เวิร์ดที่สมบูรณ์ ได้แก่คำ เช่น "
foo/...
" หรือ ".*test rule
" หรือ "//bar/baz:all
" หากลำดับอักขระเป็น "เครื่องหมายคำพูด" (ขึ้นต้นและลงท้ายด้วยเครื่องหมายคำพูดเดี่ยว " หรือ ขึ้นต้นและลงท้ายด้วยเครื่องหมายคำพูดคู่ ") แสดงว่าเป็นคำ หากไม่ได้ใส่เครื่องหมายคำพูดไว้ ซีเควนซ์อักขระอาจยังคงได้รับการแยกวิเคราะห์เป็นคำ คำที่ไม่ใส่เครื่องหมายคำพูดคือลำดับของอักขระที่มาจากตัวอักษร A-Za-z, ตัวเลข 0-9 และสัญลักษณ์พิเศษ*/@.-_:$~[]
(เครื่องหมายดอกจัน เครื่องหมายทับ ที่ จุด ขีดกลาง ขีดล่าง โคลอน ดอลลาร์ เครื่องหมายดอลลาร์ เครื่องหมายทิลเดอ วงเล็บเหลี่ยมเปิด วงเล็บเหลี่ยมปิด) อย่างไรก็ตาม คำที่ไม่ได้ใส่เครื่องหมายคำพูดต้องไม่ขึ้นต้นด้วยขีดกลาง-
หรือเครื่องหมายดอกจัน*
แม้ว่าชื่อเป้าหมายแบบสัมพัทธ์อาจขึ้นต้นด้วยอักขระเหล่านั้นนอกจากนี้ คำที่ไม่ใส่เครื่องหมายคำพูดต้องไม่มีอักขระบวก
+
หรือเท่ากับเครื่องหมาย=
แม้ว่าอักขระเหล่านั้นจะได้รับอนุญาตในชื่อเป้าหมายก็ตาม เมื่อเขียนโค้ดที่สร้างนิพจน์คำค้นหา ควรใส่เครื่องหมายคำพูดกำกับไว้การใส่เครื่องหมายคำพูดต้องทำเมื่อเขียนสคริปต์ที่สร้างนิพจน์การค้นหา Bazel จากค่าที่ผู้ใช้ระบุ
//foo:bar+wiz # WRONG: scanned as //foo:bar + wiz. //foo:bar=wiz # WRONG: scanned as //foo:bar = wiz. "//foo:bar+wiz" # OK. "//foo:bar=wiz" # OK.
โปรดทราบว่าการยกมานี้นอกเหนือจากการยกมาอื่นๆ ที่เชลล์ของคุณอาจจำเป็นต้องมี เช่น
bazel query ' "//foo:bar=wiz" ' # single-quotes for shell, double-quotes for Bazel.
เมื่อใส่เครื่องหมายคําพูด คีย์เวิร์ดและโอเปอเรเตอร์จะถือเป็นคําธรรมดา เช่น
some
เป็นคีย์เวิร์ด แต่ "บาง" เป็นคํา ทั้งfoo
และ "foo" เป็นคําอย่างไรก็ตาม โปรดระมัดระวังเมื่อใช้เครื่องหมายคำพูดเดี่ยวหรือคู่ในชื่อเป้าหมาย เมื่อยกชื่อเป้าหมายอย่างน้อย 1 ชื่อ ให้ใช้เครื่องหมายคำพูดเพียงประเภทเดียว (เครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายคำพูดคู่ทั้งหมด)
ต่อไปนี้คือตัวอย่างของสตริงคำค้นหา Java
'a"'a' # WRONG: Error message: unclosed quotation. "a'"a" # WRONG: Error message: unclosed quotation. '"a" + 'a'' # WRONG: Error message: unexpected token 'a' after query expression '"a" + ' "'a' + "a"" # WRONG: Error message: unexpected token 'a' after query expression ''a' + ' "a'a" # OK. 'a"a' # OK. '"a" + "a"' # OK "'a' + 'a'" # OK
เราเลือกไวยากรณ์นี้เพื่อให้ไม่ต้องใช้เครื่องหมายคำพูดในกรณีส่วนใหญ่ ตัวอย่าง
".*test rule"
(ที่ผิดปกติ) ต้องใช้เครื่องหมายคำพูด เนื่องจากขึ้นต้นด้วยเครื่องหมายจุดและมีการเว้นวรรค การอ้างอิง"cc_library"
เป็นไปโดยไม่จำเป็นแต่ก็ไม่เป็นอันตรายเครื่องหมายวรรคตอน เช่น วงเล็บ
()
จุด.
และเครื่องหมายจุลภาค,
คำที่มีเครื่องหมายวรรคตอน (นอกเหนือจากข้อยกเว้นที่ระบุไว้ข้างต้น) จะต้องอยู่ในเครื่องหมายคำพูด
ระบบจะละเว้นอักขระช่องว่างนอกคำที่ยกมา
แนวคิดภาษาในการค้นหา Bazel
ภาษาที่ใช้ค้นหา Bazel คือภาษาของนิพจน์ ทุกนิพจน์จะประเมินชุดเป้าหมายที่เรียงลำดับบางส่วนหรือเทียบเท่ากราฟ (DAG) ของเป้าหมาย นี่เป็นประเภทข้อมูลเดียว
การตั้งค่าและกราฟอ้างอิงถึงประเภทข้อมูลเดียวกัน แต่เน้นที่แง่มุมต่างๆ เช่น
- Set: ลำดับบางส่วนของเป้าหมายไม่น่าสนใจ
- กราฟ: ลําดับบางส่วนของเป้าหมายมีความสําคัญ
วงจรในกราฟทรัพยากร Dependency
กราฟทรัพยากร Dependency ควรเป็นแบบวนซ้ำ
อัลกอริทึมที่ภาษาการค้นหาใช้มีไว้สําหรับใช้ในกราฟที่ไม่มีวงจร แต่มีความทนทานต่อวงจร ไม่มีการระบุรายละเอียดเกี่ยวกับวิธีการจัดการวงจร ซึ่งไม่ควรนำมาใช้
ทรัพยากร Dependency ที่ไม่ระบุ
นอกจากการพึ่งพาบิลด์ที่กําหนดไว้อย่างชัดเจนในไฟล์ BUILD
แล้ว Bazel ยังเพิ่มการพึ่งพาโดยนัยเพิ่มเติมลงในกฎด้วย เช่น กฎ Java ทุกข้อจะขึ้นอยู่กับ JavaBuilder โดยปริยาย การสร้างการพึ่งพาโดยนัยจะทําโดยใช้แอตทริบิวต์ที่ขึ้นต้นด้วย $
และไม่สามารถลบล้างได้ในไฟล์ BUILD
ตามค่าเริ่มต้น bazel query
จะพิจารณาทรัพยากร Dependency โดยนัยเมื่อคำนวณผลการค้นหา คุณเปลี่ยนลักษณะการทำงานนี้ได้ด้วยตัวเลือก --[no]implicit_deps
โปรดทราบว่าเนื่องจากคําค้นหาไม่พิจารณาการกําหนดค่า ระบบจะไม่พิจารณาเครื่องมือทางเทคนิคที่เป็นไปได้
ความเสียง
นิพจน์ภาษาการค้นหาของ Bazel จะทำงานกับกราฟความเกี่ยวข้องของบิลด์ ซึ่งเป็นกราฟที่การประกาศกฎทั้งหมดในไฟล์ BUILD
ทั้งหมดกำหนดไว้โดยนัย โปรดทราบว่ากราฟนี้ค่อนข้างเป็นนามธรรมและไม่ได้อธิบายขั้นตอนทั้งหมดของการสร้างอย่างละเอียด คุณจำเป็นต้องมีการกำหนดค่าในการสร้างบิลด์เช่นกัน ดูรายละเอียดเพิ่มเติมได้ที่ส่วนconfigurationsในคู่มือผู้ใช้
ผลของการประเมินนิพจน์ในภาษาคำค้นหา Bazel จะเป็นจริงสำหรับการกำหนดค่าทั้งหมด ซึ่งหมายความว่านี่เป็นค่าประมาณเชิงรับมากเกินไป และไม่แม่นยำเสียทีเดียว หากคุณใช้เครื่องมือค้นหาเพื่อคํานวณชุดไฟล์ต้นฉบับทั้งหมดที่จําเป็นในระหว่างการสร้าง เครื่องมืออาจรายงานมากกว่าที่จําเป็นจริง เนื่องจากเครื่องมือค้นหาจะรวมไฟล์ทั้งหมดที่จําเป็นสําหรับรองรับการแปลข้อความ แม้ว่าคุณจะไม่ได้ตั้งใจจะใช้ฟีเจอร์นั้นในบิลด์ก็ตาม
เกี่ยวกับการรักษาลำดับกราฟ
การดำเนินการจะรักษาข้อจำกัดการจัดเรียงที่รับค่ามาจากนิพจน์ย่อย คุณอาจมองสิ่งนี้เป็น "กฎการอนุรักษ์ลําดับบางส่วน" พิจารณาตัวอย่างต่อไปนี้ หากคุณส่งคําค้นหาเพื่อระบุการปิดเชิงสื่อกลางของข้อกําหนดของเป้าหมายหนึ่งๆ ชุดผลลัพธ์จะจัดเรียงตามกราฟข้อกําหนด หากคุณกรองซึ่งตั้งค่าให้รวมเฉพาะเป้าหมายประเภท file
ความสัมพันธ์ในการจัดลำดับบางส่วนแบบทางอ้อมเดียวกันระหว่างเป้าหมายทุกคู่ในเซตย่อยผลลัพธ์ แม้ว่าจริงๆ แล้วจะไม่มีคู่ใดที่เชื่อมต่อกันโดยตรงในกราฟต้นฉบับก็ตาม
(ไม่มีขอบไฟล์ต่อไฟล์ในกราฟความเกี่ยวข้องของบิลด์)
อย่างไรก็ตาม แม้ว่าโอเปอเรเตอร์ทั้งหมดเก็บรักษาลำดับไว้ แต่การดำเนินการบางอย่าง เช่น การดำเนินการตั้งค่าจะไม่นำข้อจำกัดการจัดลำดับของตนเองมาใช้ ลองพิจารณานิพจน์นี้
deps(x) union y
ลำดับของชุดผลลัพธ์สุดท้ายจะรับประกันว่าข้อจำกัดการจัดเรียงทั้งหมดของนิพจน์ย่อยจะยังคงอยู่ กล่าวคือ ลำดับความเกี่ยวข้องแบบทรานซิทีฟทั้งหมดของ x
จะจัดเรียงอย่างถูกต้องต่อกัน อย่างไรก็ตาม การค้นหาไม่ได้รับประกันเกี่ยวกับการจัดลําดับเป้าหมายใน y
หรือการจัดลําดับเป้าหมายใน deps(x)
เทียบกับเป้าหมายใน y
(ยกเว้นเป้าหมายใน y
ที่อยู่ใน deps(x)
ด้วย)
โอเปอเรเตอร์ที่ทำให้เกิดข้อจำกัดด้านลําดับ ได้แก่ allpaths
, deps
, rdeps
, somepath
และไวลด์การ์ดรูปแบบเป้าหมาย package:*
, dir/...
ฯลฯ
การค้นหาเกี่ยวกับท้องฟ้า
Sky Query คือโหมดการค้นหาที่ทำงานในขอบเขตจักรวาลที่ระบุ
ฟังก์ชันพิเศษที่ใช้ได้เฉพาะใน SkyQuery
โหมด Sky Query มีฟังก์ชันการค้นหาเพิ่มเติม allrdeps
และ rbuildfiles
ฟังก์ชันเหล่านี้ทำงานในขอบเขตทั้งจักรวาล (ซึ่งเป็นเหตุผลที่ทำให้ไม่สมเหตุสมผลสำหรับการค้นหาปกติ)
การระบุขอบเขตจักรวาล
โหมด Sky Query ได้รับการเปิดใช้งานโดยการส่งผ่าน 2 รายการต่อไปนี้:
(--universe_scope
หรือ --infer_universe_scope
) และ
--order_output=no
--universe_scope=<target_pattern1>,...,<target_patternN>
จะบอกให้คำค้นหาโหลดการปิดแบบทรานซิทีฟของรูปแบบเป้าหมายที่ระบุโดยรูปแบบเป้าหมายไว้ล่วงหน้า ซึ่งอาจเป็นได้ทั้งบวกและลบ จากนั้นคำค้นหาทั้งหมดจะได้รับการประเมินใน "ขอบเขต" นี้ โดยเฉพาะอย่างยิ่ง โอเปอเรเตอร์ allrdeps
และ rbuildfiles
จะแสดงเฉพาะผลลัพธ์จากขอบเขตนี้
--infer_universe_scope
บอกให้ Bazel อนุมานค่าสำหรับ --universe_scope
จากนิพจน์การค้นหา ค่าที่อนุมานนี้คือรายการรูปแบบเป้าหมายที่ไม่ซ้ำกันในนิพจน์การค้นหา แต่อาจไม่ใช่สิ่งที่คุณต้องการ เช่น
bazel query --infer_universe_scope --order_output=no "allrdeps(//my:target)"
รายการรูปแบบเป้าหมายที่ไม่ซ้ำกันในนิพจน์การค้นหานี้คือ ["//my:target"]
ดังนั้น
Bazel จะถือว่าการดำเนินการนี้เหมือนกับการเรียกใช้
bazel query --universe_scope=//my:target --order_output=no "allrdeps(//my:target)"
แต่ผลลัพธ์ของคำค้นหาด้วย --universe_scope
นั้นคือ //my:target
เท่านั้น ไม่มีทรัพยากร Dependency แบบย้อนกลับของ //my:target
จากการสร้างเลย ในทางกลับกัน ให้ลองพิจารณาดังนี้
bazel query --infer_universe_scope --order_output=no "tests(//a/... + b/...) intersect allrdeps(siblings(rbuildfiles(my/starlark/file.bzl)))"
นี่คือการเรียกใช้คำค้นหาที่มีความหมายซึ่งกำลังพยายามคำนวณเป้าหมายทดสอบในการขยาย tests
ของเป้าหมายภายใต้บางไดเรกทอรีที่ขึ้นอยู่กับเป้าหมายที่มีคำจำกัดความที่ใช้ไฟล์ .bzl
ที่เฉพาะเจาะจง ในที่นี้ --infer_universe_scope
มีไว้เพื่ออำนวยความสะดวก โดยเฉพาะอย่างยิ่งในกรณีที่ตัวเลือก --universe_scope
กำหนดให้คุณต้องแยกวิเคราะห์นิพจน์การค้นหาด้วยตนเอง
ดังนั้นสําหรับนิพจน์คำค้นหาที่ใช้โอเปอเรเตอร์ที่กําหนดขอบเขตระดับสากล เช่น allrdeps
และ rbuildfiles
ให้ใช้ --infer_universe_scope
ก็ต่อเมื่อลักษณะการทำงานเป็นไปตามที่ต้องการ
การค้นหา Sky มีข้อดีและข้อเสียบางอย่างเมื่อเทียบกับการค้นหาเริ่มต้น แต่ข้อเสียหลักๆ คือไม่สามารถเรียงลำดับเอาต์พุตตามลำดับกราฟได้ ทำให้ระบบไม่อนุญาตให้ใช้รูปแบบเอาต์พุตบางรูปแบบ ข้อดีคือมีโอเปอเรเตอร์ 2 รายการ (allrdeps
และ rbuildfiles
) ที่ไม่มีในการค้นหาเริ่มต้น
นอกจากนี้ Sky Query ยังทำงานโดยการดูกราฟ Skyframe แทนการสร้างกราฟใหม่ ซึ่งเป็นสิ่งที่การใช้งานเริ่มต้นทำ ดังนั้นจึงมีบางกรณีที่การค้นหาด้วยเสียงจะเร็วขึ้นและใช้หน่วยความจำน้อยลง
นิพจน์: ไวยากรณ์และความหมายของไวยากรณ์
นี่คือไวยากรณ์ของภาษาการค้นหา Bazel ที่แสดงด้วยสัญลักษณ์ EBNF
expr ::= word
| let name = expr in expr
| (expr)
| expr intersect expr
| expr ^ expr
| expr union expr
| expr + expr
| expr except expr
| expr - expr
| set(word *)
| word '(' int | word | expr ... ')'
ส่วนต่อไปนี้จะอธิบายการสร้างแต่ละรายการของไวยากรณ์นี้ตามลําดับ
รูปแบบเป้าหมาย
expr ::= word
รูปแบบเป้าหมายเป็นคำเพียงคำเดียวตามไวยากรณ์ โดยจะได้รับการแปลค่าเป็นชุดเป้าหมาย
(ไม่เรียงลำดับ) รูปแบบเป้าหมายที่ง่ายที่สุดคือป้ายกำกับ ซึ่งจะระบุเป้าหมายรายการเดียว (ไฟล์หรือกฎ) ตัวอย่างเช่น รูปแบบเป้าหมาย //foo:bar
จะประเมินชุดที่มีองค์ประกอบเดียว เป้าหมาย และกฎ bar
รูปแบบเป้าหมายจะทำให้ป้ายกำกับมีไวลด์การ์ดแทนที่แพ็กเกจและเป้าหมาย เช่น foo/...:all
(หรือแค่ foo/...
) คือรูปแบบเป้าหมายที่ประเมินค่าเป็นชุดที่มีกฎทั้งหมดในทุกแพ็กเกจแบบซ้ำซ้อนใต้ไดเรกทอรี foo
ส่วน bar/baz:all
คือรูปแบบเป้าหมายที่ประเมินค่าเป็นชุดที่มีกฎทั้งหมดในแพ็กเกจ bar/baz
แต่ไม่ใช่แพ็กเกจย่อย
ในทำนองเดียวกัน foo/...:*
เป็นรูปแบบเป้าหมายที่ประเมินชุดที่มีเป้าหมาย (กฎและไฟล์) ทั้งหมดในทุกแพ็กเกจโดยเกิดซ้ำใต้ไดเรกทอรี foo
โดย bar/baz:*
จะประเมินชุดที่มีเป้าหมายทั้งหมดในแพ็กเกจ bar/baz
แต่ไม่ใช่แพ็กเกจย่อย
เนื่องจากไวลด์การ์ด :*
จับคู่กับไฟล์และกฎต่างๆ จึงมักมีประโยชน์มากกว่า :all
สำหรับการค้นหา ในทางกลับกัน ไวลด์การ์ด :all
(โดยนัยในรูปแบบเป้าหมาย เช่น foo/...
) มักมีประโยชน์กับบิลด์มากกว่า
รูปแบบเป้าหมาย bazel query
ทำงานเหมือนกับเป้าหมายของบิลด์ bazel build
สำหรับรายละเอียดเพิ่มเติม โปรดดูรูปแบบเป้าหมาย หรือพิมพ์ bazel help target-syntax
รูปแบบเป้าหมายอาจประเมินเป็นเซตเดี่ยว (ในกรณีของป้ายกํากับ) เป็นเซตที่มีองค์ประกอบหลายรายการ (เช่น ในกรณีของ foo/...
ซึ่งมีองค์ประกอบหลายพันรายการ) หรือเป็นเซตว่าง หากรูปแบบเป้าหมายไม่ตรงกับเป้าหมาย
โหนดทั้งหมดในผลลัพธ์ของนิพจน์รูปแบบเป้าหมายมีการจัดเรียงลำดับอย่างถูกต้องโดยสัมพันธ์กับกันและกันตามความสัมพันธ์ของทรัพยากร Dependency ดังนั้น ผลลัพธ์ของ foo:*
จึงไม่ใช่แค่ชุดเป้าหมายในแพ็กเกจ foo
เท่านั้น แต่ยังเป็นกราฟของเป้าหมายเหล่านั้นด้วย (ไม่มีการรับประกันเกี่ยวกับลําดับสัมพัทธ์ของโหนดผลลัพธ์เทียบกับโหนดอื่นๆ) ดูรายละเอียดเพิ่มเติมได้ที่ส่วน
ลำดับกราฟ
ตัวแปร
expr ::= let name = expr1 in expr2
| $name
ภาษาในการค้นหา Bazel ทำให้กำหนดคำจำกัดความและการอ้างอิงตัวแปรได้ ผลลัพธ์ของการประเมินนิพจน์ let
จะเหมือนกับของ expr2 โดยที่ค่าของ expr1 จะแทนที่ตัวแปร name ทั้งหมดที่ปรากฏขึ้น
เช่น let v = foo/... in allpaths($v, //common) intersect $v
เทียบเท่ากับ allpaths(foo/...,//common) intersect foo/...
การเกิดการอ้างอิงตัวแปร name
อื่นที่ไม่ใช่ในนิพจน์ let name = ...
ที่ล้อมรอบเป็นข้อผิดพลาด กล่าวคือ นิพจน์การค้นหาระดับบนสุดต้องไม่มีตัวแปรอิสระ
ในการสร้างไวยากรณ์ข้างต้น name
จะเหมือนกับ word แต่มีข้อจำกัดเพิ่มเติมว่าต้องเป็นตัวระบุทางกฎหมายในภาษาโปรแกรม C การอ้างอิงตัวแปรจะต้องเพิ่มอักขระ "$" ไว้หน้า
นิพจน์ let
แต่ละรายการจะกำหนดตัวแปรได้เพียงรายการเดียว แต่คุณฝังนิพจน์เหล่านี้ได้
ทั้งรูปแบบเป้าหมายและการอ้างอิงตัวแปรประกอบด้วยโทเค็นเพียงรายการเดียว ซึ่งเป็นคําเดียว ซึ่งทําให้เกิดความคลุมเครือทางไวยากรณ์ อย่างไรก็ตาม จะไม่มีความกำกวมทางความหมาย เนื่องจากชุดย่อยของคำที่เป็นชื่อตัวแปรทางกฎหมายนั้นไม่ต่อเนื่องจากชุดย่อยของคำที่เป็นรูปแบบเป้าหมายทางกฎหมาย
ในทางเทคนิคแล้ว นิพจน์ let
จะไม่เพิ่มความชัดเจนของภาษาในการค้นหา คำค้นหาใดๆ ที่แสดงได้ในภาษานั้นก็จะแสดงโดยไม่มีคำเหล่านั้นได้ อย่างไรก็ตาม ฟีเจอร์นี้ช่วยเพิ่มความกระชับของคำค้นหาจำนวนมาก และอาจทําให้การประเมินคําค้นหามีประสิทธิภาพมากขึ้นด้วย
นิพจน์ที่อยู่ในวงเล็บ
expr ::= (expr)
เครื่องหมายวงเล็บจะเชื่อมโยงนิพจน์ย่อยเพื่อบังคับลําดับการประเมิน นิพจน์ที่มีวงเล็บจะประเมินค่าอาร์กิวเมนต์
การดำเนินการชุดพีชคณิต: อินเตอร์เซกชัน ยูเนียน เซตความแตกต่าง
expr ::= expr intersect expr
| expr ^ expr
| expr union expr
| expr + expr
| expr except expr
| expr - expr
โอเปอเรเตอร์ทั้ง 3 รายการนี้จะคํานวณการดำเนินการชุดตามปกติกับอาร์กิวเมนต์
โอเปอเรเตอร์แต่ละรายการมี 2 รูปแบบ ได้แก่ รูปแบบเล็กน้อย เช่น intersect
และรูปแบบสัญลักษณ์ เช่น ^
ทั้งสองรูปแบบเหมือนกัน กล่าวคือรูปแบบสัญลักษณ์จะพิมพ์ได้เร็วกว่า (เพื่อความชัดเจน ส่วนที่เหลือของหน้านี้ใช้รูปทั่วไป)
ตัวอย่างเช่น
foo/... except foo/bar/...
ประเมินเป็นชุดเป้าหมายที่ตรงกับ foo/...
แต่ไม่ใช่ foo/bar/...
คุณสามารถเขียนคำค้นหาเดียวกันได้ดังนี้
foo/... - foo/bar/...
การดำเนินการ intersect
(^
) และ union
(+
) เป็นแบบสลับกัน (แบบสมมาตร)
except
(-
) เป็นแบบไม่สมมาตร โปรแกรมแยกวิเคราะห์จะถือว่าโอเปอเรเตอร์ทั้ง 3 รายการเป็นโอเปอเรเตอร์แบบแอตทริบิวต์แบบซ้ายและมีลําดับความสําคัญเท่ากัน คุณจึงอาจต้องใช้วงเล็บ ตัวอย่างเช่น สองนิพจน์แรกนั้นเทียบเท่ากัน แต่นิพจน์ที่สามไม่ใช่
x intersect y union z
(x intersect y) union z
x intersect (y union z)
อ่านเป้าหมายจากแหล่งที่มาภายนอก: ตั้งค่าแล้ว
expr ::= set(word *)
set(a b c ...)
โอเปอเรเตอร์จะคํานวณยูเนียนของชุดรูปแบบเป้าหมายอย่างน้อย 1 ชุด โดยคั่นด้วยเว้นวรรค (ไม่มีคอมมา)
set()
สามารถใช้ร่วมกับฟีเจอร์ $(...)
ของ Bourne shell เพื่อบันทึกผลการค้นหารายการเดียวในไฟล์ข้อความธรรมดา จัดการไฟล์ข้อความนั้นโดยใช้โปรแกรมอื่นๆ (เช่น เครื่องมือเชลล์ UNIX มาตรฐาน) จากนั้นนําผลการค้นหากลับไปยังเครื่องมือค้นหาเป็นค่าสําหรับการประมวลผลเพิ่มเติม เช่น
bazel query deps(//my:target) --output=label | grep ... | sed ... | awk ... > foo
bazel query "kind(cc_binary, set($(<foo)))"
ในตัวอย่างถัดไปkind(cc_library, deps(//some_dir/foo:main, 5))
จะคำนวณโดยการกรองค่า maxrank
โดยใช้โปรแกรม awk
bazel query 'deps(//some_dir/foo:main)' --output maxrank | awk '($1 < 5) { print $2;} ' > foo
bazel query "kind(cc_library, set($(<foo)))"
ในตัวอย่างนี้ $(<foo)
เป็นตัวย่อของ $(cat foo)
แต่อาจใช้คำสั่งเชลล์อื่นๆ นอกเหนือจาก cat
ได้ด้วย เช่น คำสั่ง awk
ก่อนหน้า
ฟังก์ชัน
expr ::= word '(' int | word | expr ... ')'
ภาษาคําค้นหาจะกําหนดฟังก์ชันหลายรายการ ชื่อของฟังก์ชันจะกำหนดจำนวนและประเภทของอาร์กิวเมนต์ที่ต้องการ โดยมีฟังก์ชันต่อไปนี้
allpaths
attr
buildfiles
rbuildfiles
deps
filter
kind
labels
loadfiles
rdeps
allrdeps
same_pkg_direct_rdeps
siblings
some
somepath
tests
visible
ปิดเชิงการเปลี่ยนรูปแบบของ Dependency: deps
expr ::= deps(expr)
| deps(expr, depth)
ตัวดำเนินการ deps(x)
จะประเมินเป็นกราฟที่สร้างขึ้นจากความสัมพันธ์แบบทรานซิทีฟของชุดอาร์กิวเมนต์ x เช่น ค่าของ deps(//foo)
คือกราฟการขึ้นต่อที่อิงตามโหนดเดี่ยว foo
รวมถึงการขึ้นต่อกันทั้งหมดของโหนดนั้น ค่าของ deps(foo/...)
คือกราฟความเกี่ยวข้องที่มีรูทเป็นกฎทั้งหมดในทุกแพ็กเกจที่อยู่ภายใต้ไดเรกทอรี foo
ในบริบทนี้ "dependencies" หมายถึงกฎและเป้าหมายไฟล์เท่านั้น ดังนั้นไฟล์ BUILD
และ Starlark ที่จำเป็นในการสร้างเป้าหมายเหล่านี้จึงไม่ได้รวมไว้ที่นี่ คุณควรใช้โอเปอเรเตอร์ buildfiles
กราฟที่ได้จะจัดเรียงตามความสัมพันธ์แบบ Dependency ดูรายละเอียดเพิ่มเติมได้ที่ส่วนลําดับกราฟ
โอเปอเรเตอร์ deps
ยอมรับอาร์กิวเมนต์ที่ 2 ซึ่งไม่บังคับ ซึ่งเป็นจำนวนเต็มที่ระบุขอบเขตบนของความลึกของการค้นหา ดังนั้น deps(foo:*, 0)
จะแสดงผลเป้าหมายทั้งหมดในแพ็กเกจ foo
ขณะที่ deps(foo:*, 1)
ยังรวมข้อกำหนดเบื้องต้นโดยตรงของเป้าหมายในแพ็กเกจ foo
และ deps(foo:*, 2)
รวมโหนดที่เข้าถึงได้โดยตรงจากโหนดใน deps(foo:*, 1)
และอื่นๆ อีก (ตัวเลขเหล่านี้สอดคล้องกับอันดับที่แสดงในรูปแบบเอาต์พุต minrank
)
หากไม่ระบุพารามิเตอร์ depth การค้นหาจะเป็นแบบไม่จำกัด โดยจะคํานวณการปิดแบบสะท้อนกลับแบบทรานซิทีฟของข้อกําหนดเบื้องต้น
การปิดแบบทางอ้อมของทรัพยากร Dependency แบบย้อนกลับ: rdeps
expr ::= rdeps(expr, expr)
| rdeps(expr, expr, depth)
โอเปอเรเตอร์ rdeps(u, x)
จะประเมินทรัพยากร Dependency แบบย้อนกลับของชุดอาร์กิวเมนต์ x ภายในปิดทรานซิทีฟของชุดจักรวาล u
กราฟที่ได้จะจัดเรียงตามความสัมพันธ์แบบ Dependency ดูรายละเอียดเพิ่มเติมได้ในส่วนลําดับแผนภูมิ
โอเปอเรเตอร์ rdeps
ยอมรับอาร์กิวเมนต์ที่สาม (ไม่บังคับ) ซึ่งเป็นจำนวนเต็มที่ระบุขอบเขตบนของความลึกของการค้นหา กราฟที่ได้จะรวมเฉพาะโหนดที่อยู่ภายในระยะความลึกที่ระบุจากโหนดใดก็ได้ในชุดอาร์กิวเมนต์ ดังนั้น rdeps(//foo, //common, 1)
จึงประเมินเป็นโหนดทั้งหมดใน Closure แบบทรานซิทีฟของ //foo
ที่ขึ้นอยู่กับ //common
โดยตรง (ตัวเลขเหล่านี้สอดคล้องกับอันดับที่แสดงในรูปแบบเอาต์พุต minrank
) หากไม่ระบุพารามิเตอร์ depth การค้นหาจะไม่มีขอบเขต
การปิดแบบทางอ้อมของทรัพยากร Dependency แบบย้อนกลับทั้งหมด: allrdeps
expr ::= allrdeps(expr)
| allrdeps(expr, depth)
โอเปอเรเตอร์ allrdeps
จะทํางานเหมือนกับโอเปอเรเตอร์ rdeps
ยกเว้นว่า "ชุดจักรวาล" คือค่าที่ธง --universe_scope
ประเมินแทนที่จะระบุแยกต่างหาก ดังนั้น หากระบบผ่าน --universe_scope=//foo/...
แล้ว allrdeps(//bar)
จะเท่ากับ rdeps(//foo/..., //bar)
ไลบรารีที่อ้างอิงย้อนกลับโดยตรงในแพ็กเกจเดียวกัน: same_pkg_direct_rdeps
expr ::= same_pkg_direct_rdeps(expr)
โอเปอเรเตอร์ same_pkg_direct_rdeps(x)
จะประเมินชุดเป้าหมายทั้งหมดที่อยู่ในแพ็กเกจเดียวกันกับเป้าหมายในชุดอาร์กิวเมนต์ ซึ่งขึ้นอยู่กับเป้าหมายโดยตรง
การจัดการกับแพ็กเกจของเป้าหมาย: พี่น้อง
expr ::= siblings(expr)
โอเปอเรเตอร์ siblings(x)
จะประเมินเป็นเป้าหมายทั้งชุดที่อยู่ในแพ็กเกจเดียวกับเป้าหมายในชุดอาร์กิวเมนต์
ทางเลือกที่ไม่เจาะจง: บางรายการ
expr ::= some(expr)
| some(expr, count )
โอเปอเรเตอร์ some(x, k)
จะเลือกเป้าหมายไม่เกิน k รายการโดยไม่มีกฎเกณฑ์จากชุดอาร์กิวเมนต์ x และประเมินได้เป็นชุดที่มีเฉพาะเป้าหมายเหล่านั้น พารามิเตอร์ k ไม่บังคับ หากไม่มี พารามิเตอร์นี้ ผลลัพธ์จะเป็นชุดเดี่ยวที่มีเป้าหมายเพียงรายการเดียวที่เลือกโดยพลการ หากขนาดของชุดอาร์กิวเมนต์ x เล็กกว่า k ระบบจะแสดงผลชุดอาร์กิวเมนต์ x ทั้งหมด
ตัวอย่างเช่น นิพจน์ some(//foo:main union //bar:baz)
จะประเมินชุดเดี่ยวที่มี //foo:main
หรือ //bar:baz
แม้จะไม่ได้กำหนดไว้เป็นชุดใด นิพจน์ some(//foo:main union //bar:baz, 2)
หรือ some(//foo:main union //bar:baz, 3)
จะแสดงผลทั้ง //foo:main
และ //bar:baz
หากอาร์กิวเมนต์เป็นเดี่ยวๆ some
จะคำนวณฟังก์ชันข้อมูลประจำตัว: some(//foo:main)
ที่เทียบเท่ากับ //foo:main
โดยจะเกิดข้อผิดพลาดหากชุดอาร์กิวเมนต์ที่ระบุว่างเปล่า ดังเช่นในนิพจน์ some(//foo:main intersect //bar:baz)
โอเปอเรเตอร์เส้นทาง: somepath, allpaths
expr ::= somepath(expr, expr)
| allpaths(expr, expr)
โอเปอเรเตอร์ somepath(S, E)
และ allpaths(S, E)
จะคํานวณเส้นทางระหว่างเป้าหมาย 2 ชุด การค้นหาทั้ง 2 แบบยอมรับอาร์กิวเมนต์ 2 รายการ คือ S ชุดของจุดเริ่มต้นและชุดจุดสิ้นสุด E somepath
จะแสดงผลกราฟของโหนดในเส้นทางที่กำหนดเองบางจากเป้าหมายใน S ไปยังเป้าหมายใน E allpaths
จะแสดงผลกราฟของโหนดบนเส้นทางทั้งหมดจากเป้าหมายใดๆ ใน S ไปยังเป้าหมายใดๆ ใน E
กราฟผลลัพธ์จะถูกเรียงลำดับตามความสัมพันธ์ในการพึ่งพา ดูรายละเอียดเพิ่มเติมได้ที่ส่วนลําดับแผนภูมิ
การกรองชนิดเป้าหมาย: ชนิด
expr ::= kind(word, expr)
โอเปอเรเตอร์ kind(pattern, input)
ใช้ตัวกรองกับชุดเป้าหมาย และทิ้งเป้าหมายเหล่านั้นซึ่งไม่ใช่ประเภทที่คาดไว้ พารามิเตอร์ pattern
จะระบุประเภทเป้าหมายที่จะจับคู่
ตัวอย่างเช่น ประเภทของเป้าหมาย 4 รายการที่ไฟล์ BUILD
(สําหรับแพ็กเกจ p
) ระบุไว้ดังที่แสดงด้านล่างจะแสดงในตาราง
รหัส | เป้าหมาย | ชนิด |
---|---|---|
genrule( name = "a", srcs = ["a.in"], outs = ["a.out"], cmd = "...", ) |
//p:a |
กฎ Genrule |
//p:a.in |
ไฟล์ต้นฉบับ | |
//p:a.out |
ไฟล์ที่สร้างขึ้น | |
//p:BUILD |
ไฟล์ต้นฉบับ |
ดังนั้น kind("cc_.* rule", foo/...)
จะประเมินชุดของ cc_library
, cc_binary
, ฯลฯ เป้าหมายกฎทั้งหมดภายใต้ foo
และ kind("source file", deps(//foo))
จะประเมินชุดของไฟล์ต้นทางทั้งหมดเมื่อปิดทรัพยากร Dependency ของเป้าหมาย //foo
แบบทางอ้อม
มักต้องมีเครื่องหมายคำพูดของอาร์กิวเมนต์ pattern เนื่องจากโปรแกรมแยกวิเคราะห์ไม่ถือว่าเป็นคำของนิพจน์ทั่วไปจำนวนมาก เช่น source
file
และ .*_test
เมื่อจับคู่กับ package group
เป้าหมายที่ลงท้ายด้วย
:all
อาจไม่แสดงผลลัพธ์ใดๆ ให้ใช้ :all-targets
แทน
การกรองชื่อเป้าหมาย: ตัวกรอง
expr ::= filter(word, expr)
โอเปอเรเตอร์ filter(pattern, input)
จะนําตัวกรองไปใช้กับชุดเป้าหมาย และทิ้งเป้าหมายที่มีป้ายกํากับ (ในรูปแบบสัมบูรณ์) ไม่ตรงกับรูปแบบ โดยประเมินผลเป็นชุดย่อยของอินพุต
อาร์กิวเมนต์แรก pattern คือคำที่มีนิพจน์ทั่วไปทับชื่อเป้าหมาย นิพจน์ filter
จะประเมินเป็นชุดที่มีเป้าหมาย x ทั้งหมดโดยที่ x เป็นสมาชิกของชุด input และป้ายกำกับ (ในรูปแบบสัมบูรณ์ เช่น //foo:bar
) ของ x มีการจับคู่ (แบบไม่ยึดตำแหน่ง) สำหรับนิพจน์ทั่วไป pattern เนื่องจากชื่อเป้าหมายทั้งหมดขึ้นต้นด้วย //
จึงอาจใช้แทน Anchor ของนิพจน์ทั่วไป ^
ได้
โอเปอเรเตอร์นี้มักมอบทางเลือกที่รวดเร็วและมีประสิทธิภาพมากกว่าโอเปอเรเตอร์ intersect
ตัวอย่างเช่น หากต้องการดูทรัพยากร Dependency ทั้งหมด bar
ของเป้าหมาย //foo:foo
อาจมีผู้ประเมิน
deps(//foo) intersect //bar/...
อย่างไรก็ตาม คำสั่งนี้จะต้องมีการแยกวิเคราะห์ไฟล์ BUILD
ทั้งหมดในต้นไม้ bar
ซึ่งจะทําให้ช้าและอาจเกิดข้อผิดพลาดในไฟล์ BUILD
ที่ไม่เกี่ยวข้อง อีกทางเลือกหนึ่งคือ
filter(//bar, deps(//foo))
ซึ่งจะคำนวณชุดทรัพยากร Dependency ของ //foo
ก่อน แล้วจึงกรองเฉพาะเป้าหมายที่ตรงกับรูปแบบที่ระบุ ส่วนคำอื่นๆ คือเป้าหมายที่มีชื่อที่มี //bar
เป็นสตริงย่อย
การใช้งานทั่วไปอีกอย่างหนึ่งของผู้ดำเนินการ filter(pattern,
expr)
คือกรองไฟล์ที่เฉพาะเจาะจงตามชื่อหรือนามสกุล ตัวอย่างเช่น
filter("\.cc$", deps(//foo))
จะแสดงรายการของ .cc
ไฟล์ทั้งหมดที่ใช้ในการสร้าง //foo
การกรองแอตทริบิวต์ของกฎ: attr
expr ::= attr(word, word, expr)
attr(name, pattern, input)
โอเปอเรเตอร์จะใช้ตัวกรองกับชุดเป้าหมาย และทิ้งเป้าหมายที่ไม่ใช่กฎ เป้าหมายกฎที่ไม่ได้กําหนดแอตทริบิวต์ name หรือเป้าหมายกฎที่ค่าแอตทริบิวต์ไม่ตรงกับนิพจน์ทั่วไป pattern ที่ระบุ โดยจะประเมินเฉพาะข้อมูลย่อยของอินพุต
อาร์กิวเมนต์แรก name คือชื่อของแอตทริบิวต์กฎที่ควรจับคู่กับรูปแบบนิพจน์ทั่วไปที่ระบุ อาร์กิวเมนต์ที่ 2 ซึ่งก็คือ pattern คือนิพจน์ทั่วไปสำหรับค่าแอตทริบิวต์ นิพจน์ attr
จะประเมินชุดที่มีเป้าหมายทั้งหมด
x โดยที่ x เป็นสมาชิกของชุด input เป็นกฎที่มีแอตทริบิวต์ที่กำหนดไว้ name และค่าแอตทริบิวต์มีการจับคู่ที่ตรงกัน (ไม่เชื่อมโยง) สำหรับนิพจน์ทั่วไป
pattern หาก name เป็นแอตทริบิวต์ที่ไม่บังคับและกฎไม่ได้ระบุไว้อย่างชัดเจน ระบบจะใช้ค่าแอตทริบิวต์เริ่มต้นสำหรับการเปรียบเทียบ ตัวอย่างเช่น
attr(linkshared, 0, deps(//foo))
จะเลือกทรัพยากร Dependency ทั้งหมด //foo
รายการที่ได้รับอนุญาตให้มีแอตทริบิวต์ "ลิงก์ที่แชร์" (เช่น กฎ cc_binary
) และตั้งค่าเป็น 0 อย่างชัดแจ้ง หรือไม่ได้ตั้งค่าเลย แต่ค่าเริ่มต้นจะเป็น 0 (เช่น สำหรับกฎ cc_binary
)
ระบบจะแปลงแอตทริบิวต์ประเภทลิสต์ (เช่น srcs
, data
ฯลฯ) เป็นสตริงในรูปแบบ [value<sub>1</sub>, ..., value<sub>n</sub>]
โดยขึ้นต้นด้วยวงเล็บ [
และลงท้ายด้วยวงเล็บ ]
และใช้ ",
" (คอมมา, เว้นวรรค) เพื่อคั่นค่าหลายรายการ
ป้ายกำกับจะแปลงเป็นสตริงโดยใช้รูปแบบสัมบูรณ์ของป้ายกำกับ เช่น ระบบจะแปลงแอตทริบิวต์ deps=[":foo",
"//otherpkg:bar", "wiz"]
เป็นสตริง [//thispkg:foo, //otherpkg:bar, //thispkg:wiz]
วงเล็บจะมีอยู่เสมอ ดังนั้นรายการว่างจะใช้ค่าสตริง []
เพื่อวัตถุประสงค์ในการจับคู่ ตัวอย่างเช่น
attr("srcs", "\[\]", deps(//foo))
จะเลือกกฎทั้งหมดใน //foo
Dependency ที่มีแอตทริบิวต์ srcs
ว่างเปล่า ส่วน
attr("data", ".{3,}", deps(//foo))
จะเลือกกฎทั้งหมดในทรัพยากร Dependency ของ //foo
ที่ระบุอย่างน้อย 1 ค่าในแอตทริบิวต์ data
(ทุกป้ายกำกับมีความยาวอย่างน้อย 3 อักขระเนื่องจาก //
และ :
)
หากต้องการเลือกกฎทั้งหมดในหมู่//foo
Dependency ที่มี value
หนึ่งๆ ในแอตทริบิวต์ประเภทลิสต์ ให้ใช้
attr("tags", "[\[ ]value[,\]]", deps(//foo))
ซึ่งทำได้เนื่องจากอักขระที่อยู่ก่อน value
จะเป็น [
หรือการเว้นวรรค และอักขระที่ตามหลัง value
จะเป็นเครื่องหมายจุลภาคหรือ ]
การกรองระดับการมองเห็นกฎ: มองเห็นได้
expr ::= visible(expr, expr)
โอเปอเรเตอร์ visible(predicate, input)
ใช้ตัวกรองกับชุดเป้าหมาย และทิ้งเป้าหมายโดยไม่มีระดับการเข้าถึงที่จำเป็น
อาร์กิวเมนต์แรก predicate คือชุดของเป้าหมายที่จะต้องมองเห็นเป้าหมายทั้งหมดในเอาต์พุต นิพจน์ visible จะประเมินชุดที่มีเป้าหมายทั้งหมด x โดยที่ x เป็นสมาชิกของชุด input และสำหรับเป้าหมายทั้งหมด y ใน predicate x จะปรากฏแก่ y เช่น
visible(//foo, //bar:*)
จะเลือกเป้าหมายทั้งหมดในแพ็กเกจ //bar
ที่ //foo
ใช้ได้โดยที่ไม่ละเมิดข้อจำกัดการแสดงผล
การประเมินแอตทริบิวต์กฎสำหรับป้ายกำกับประเภท: ป้ายกำกับ
expr ::= labels(word, expr)
โอเปอเรเตอร์ labels(attr_name, inputs)
จะแสดงผลชุดของเป้าหมายที่ระบุในแอตทริบิวต์ attr_name ของประเภท "ป้ายกำกับ" หรือ "รายการป้ายกำกับ" ในกฎบางกฎในชุด inputs
เช่น labels(srcs, //foo)
จะแสดงชุดเป้าหมายที่ปรากฏในแอตทริบิวต์ srcs
ของกฎ //foo
หากมีกฎหลายข้อที่มีแอตทริบิวต์ srcs
ในชุด inputs ระบบจะแสดงผลการรวมของ srcs
ขยายและกรอง test_suites: การทดสอบ
expr ::= tests(expr)
โอเปอเรเตอร์ tests(x)
จะแสดงผลชุดกฎการทดสอบทั้งหมดในชุด x, ขยายกฎ test_suite
ไปยังชุดการทดสอบเดี่ยวที่อ้างอิงถึงและใช้การกรองโดย tag
และ size
โดยค่าเริ่มต้น การประเมินการค้นหาจะไม่สนใจเป้าหมายที่ไม่ใช่การทดสอบในกฎ test_suite
ทั้งหมด ซึ่งอาจเปลี่ยนเป็นข้อผิดพลาดได้โดยใช้ตัวเลือก --strict_test_suite
เช่น การค้นหา kind(test, foo:*)
จะแสดงกฎ *_test
และ test_suite
ทั้งหมดในแพ็กเกจ foo
ผลการค้นหาทั้งหมด (ตามคำจำกัดความ) จะเป็นสมาชิกของแพ็กเกจ foo
ในทางตรงกันข้าม คำค้นหา tests(foo:*)
จะแสดงผลการทดสอบแต่ละรายการทั้งหมดที่จะดำเนินการโดย bazel test
foo:*
ซึ่งอาจรวมถึงการทดสอบที่เป็นของแพ็กเกจอื่นๆ ที่มีการอ้างอิงผ่านกฎ test_suite
โดยตรงหรือโดยอ้อม
ไฟล์คำจำกัดความของแพ็กเกจ: ไฟล์บิลด์
expr ::= buildfiles(expr)
โอเปอเรเตอร์ buildfiles(x)
จะแสดงผลชุดของไฟล์ที่ระบุแพ็กเกจของแต่ละเป้าหมายในชุด x กล่าวคือ ไฟล์ BUILD
ของแต่ละแพ็กเกจ รวมถึงไฟล์ .bzl ทั้งหมดที่อ้างอิงถึงผ่านทาง load
โปรดทราบว่าการดำเนินการนี้จะแสดงไฟล์ BUILD
ของแพ็กเกจที่มีไฟล์ load
เหล่านี้ด้วย
โดยปกติแล้วโอเปอเรเตอร์นี้จะใช้ในการกำหนดว่าต้องใช้ไฟล์หรือแพ็กเกจใดบ้างในการสร้างเป้าหมายที่ระบุ ซึ่งมักจะใช้ร่วมกับตัวเลือก --output package
ด้านล่าง) ตัวอย่างเช่น
bazel query 'buildfiles(deps(//foo))' --output package
แสดงผลชุดของแพ็กเกจทั้งหมดที่ //foo
ขึ้นต่อกันและกัน
ไฟล์การกำหนดแพ็กเกจ: rbuildfiles
expr ::= rbuildfiles(word, ...)
โอเปอเรเตอร์ rbuildfiles
จะรับรายการส่วนย่อยของเส้นทางซึ่งคั่นด้วยคอมมาและแสดงผลชุดไฟล์ BUILD
ซึ่งอาศัยส่วนย่อยของเส้นทางเหล่านี้แบบสับเปลี่ยน เช่น หาก //foo
เป็นแพ็กเกจ rbuildfiles(foo/BUILD)
จะแสดงผลเป้าหมาย //foo:BUILD
หากไฟล์ foo/BUILD
มี load('//bar:file.bzl'...
อยู่ด้วย rbuildfiles(bar/file.bzl)
จะแสดงผลเป้าหมาย //foo:BUILD
รวมถึงเป้าหมายสำหรับไฟล์ BUILD
อื่นๆ ที่โหลด //bar:file.bzl
ขอบเขตของโอเปอเรเตอร์ --universe_scope
ไฟล์ที่ไม่เป็นไปตามไฟล์ BUILD
และ .bzl
โดยตรงจะไม่ส่งผลต่อผลการค้นหา ตัวอย่างเช่น ระบบจะไม่สนใจไฟล์ต้นทาง (เช่น foo.cc
) แม้ว่าจะมีการพูดถึงไฟล์ดังกล่าวอย่างชัดเจนในไฟล์ BUILD
อย่างไรก็ตาม ระบบจะพิจารณาซิมลิงก์ด้วย ดังนั้นหาก foo/BUILD
เป็นซิมลิงก์ไปยัง bar/BUILD
rbuildfiles(bar/BUILD)
จะรวม //foo:BUILD
ไว้ในผลการค้นหา
โอเปอเรเตอร์ rbuildfiles
เกือบจะตรงข้ามกับโอเปอเรเตอร์ buildfiles
อย่างไรก็ตาม การกลับด้านจริยธรรมนี้ยึดมั่นในทิศทางเดียวมากกว่า กล่าวคือ เอาต์พุตของ rbuildfiles
จะเหมือนกับอินพุตของ buildfiles
เอาต์พุตแรกจะมีเป้าหมายไฟล์เพียง BUILD
รายการในแพ็กเกจ และผลลัพธ์หลังอาจมีเป้าหมายดังกล่าว ในอีกทิศทางหนึ่ง การสื่อสารจะอ่อนกว่า เอาต์พุตของโอเปอเรเตอร์ buildfiles
คือเป้าหมายที่สอดคล้องกับแพ็กเกจและ ทั้งหมดbzl
ไฟล์ที่จำเป็นต่ออินพุตที่ระบุ อย่างไรก็ตาม อินพุตของโอเปอเรเตอร์ rbuildfiles
ไม่ใช่เป้าหมายเหล่านั้น แต่เป็นส่วนย่อยของเส้นทางที่สอดคล้องกับเป้าหมายเหล่านั้น
ไฟล์คําจํากัดความของแพ็กเกจ: loadfiles
expr ::= loadfiles(expr)
โอเปอเรเตอร์ loadfiles(x)
จะแสดงผลชุดของไฟล์ Starlark ที่จำเป็นต่อการโหลดแพ็กเกจของเป้าหมายแต่ละรายการในชุด x กล่าวคือ สำหรับแต่ละแพ็กเกจ ระบบจะแสดงไฟล์ .bzl ที่อ้างอิงจากไฟล์ BUILD
ของแพ็กเกจนั้น
รูปแบบเอาต์พุต
bazel query
จะสร้างกราฟ
คุณสามารถระบุเนื้อหา รูปแบบ และลําดับที่ bazel query
จะแสดงกราฟนี้ได้ด้วยตัวเลือกบรรทัดคําสั่ง --output
เมื่อเรียกใช้ Sky Query จะอนุญาตเฉพาะรูปแบบเอาต์พุตที่เข้ากันได้กับเอาต์พุตที่ไม่เรียงลำดับเท่านั้น กล่าวโดยละเอียดคือ ไม่อนุญาตให้ใช้รูปแบบเอาต์พุต graph
, minrank
และ maxrank
รูปแบบเอาต์พุตบางรูปแบบยอมรับตัวเลือกเพิ่มเติม ชื่อตัวเลือกเอาต์พุตแต่ละรายการจะมีรูปแบบเอาต์พุตที่ใช้อยู่อยู่ข้างหน้า ดังนั้น --graph:factored
จะมีผลเฉพาะเมื่อใช้ --output=graph
เท่านั้น และจะไม่มีผลหากใช้รูปแบบเอาต์พุตอื่นที่ไม่ใช่ graph
ในทำนองเดียวกัน --xml:line_numbers
จะมีผลก็ต่อเมื่อใช้ --output=xml
เท่านั้น
เกี่ยวกับลําดับของผลการค้นหา
แม้ว่านิพจน์ข้อความค้นหาจะเป็นไปตาม "กฎการรักษาลำดับกราฟ" เสมอ แต่การนำเสนอผลลัพธ์อาจทำได้ในลักษณะเรียงลำดับขึ้นหรือไม่เรียงลำดับ ซึ่งไม่ส่งผลต่อเป้าหมายในชุดผลลัพธ์หรือวิธีคำนวณคำค้นหา ซึ่งส่งผลเฉพาะกับวิธีการพิมพ์ผลลัพธ์ไปยัง Stdout นอกจากนี้ โหนดที่เทียบเท่ากันในลำดับทรัพยากร Dependency อาจมีหรือไม่ได้เรียงลำดับตามตัวอักษร
คุณใช้ Flag --order_output
เพื่อควบคุมลักษณะการทำงานนี้ได้
(แฟล็ก --[no]order_results
มีฟังก์ชันการทำงานเพียงบางส่วนของแฟล็ก --order_output
และเลิกใช้งานแล้ว)
ค่าเริ่มต้นของ Flag นี้คือ auto
ซึ่งจะพิมพ์ผลลัพธ์ตามลําดับคํา อย่างไรก็ตาม เมื่อใช้ somepath(a,b)
ระบบจะพิมพ์ผลลัพธ์ตามลําดับ deps
แทน
เมื่อแฟล็กนี้คือ no
และ --output
เป็นหนึ่งใน
build
, label
, label_kind
, location
, package
, proto
หรือ
xml
ระบบจะพิมพ์เอาต์พุตตามลำดับที่กำหนดเอง โดยทั่วไปแล้ว ตัวเลือกนี้เป็นตัวเลือกที่เร็วที่สุด แต่จะไม่รองรับเมื่อ --output
เป็นหนึ่งใน graph
, minrank
หรือ maxrank
เนื่องจาก Bazel จะพิมพ์ผลลัพธ์ตามลําดับหรือลําดับความสำคัญของการพึ่งพาเสมอเมื่อใช้รูปแบบเหล่านี้
เมื่อ Flag นี้เป็น deps
แสดงว่า Bazel จะพิมพ์ผลลัพธ์ตามลําดับเชิงเรขาคณิต ซึ่งก็คือจะพิมพ์รายการที่ขึ้นต่อกันก่อน อย่างไรก็ตาม ระบบอาจพิมพ์โหนดที่ไม่มีลําดับตามลําดับความเกี่ยวข้อง (เนื่องจากไม่มีเส้นทางจากโหนดหนึ่งไปยังอีกโหนดหนึ่ง) ในลําดับใดก็ได้
เมื่อ Flag นี้เป็น full
แสดงว่า Bazel จะพิมพ์โหนดตามลําดับที่แน่นอน (ทั้งหมด)
ขั้นแรก ระบบจะจัดเรียงโหนดทั้งหมดตามลําดับตัวอักษร จากนั้นแต่ละโหนดในรายการจะใช้เป็นจุดเริ่มต้นของการค้นหาแรกหลังการเรียงลำดับ สุดท้าย โหนดจะถูกพิมพ์กลับกัน
ของลำดับการเข้าชม
การพิมพ์โหนดตามลําดับนี้อาจช้าลง จึงควรใช้เฉพาะในกรณีที่การกําหนดค่าแบบกำหนดเจาะจงมีความสำคัญเท่านั้น
พิมพ์รูปแบบแหล่งที่มาของเป้าหมายตามที่ปรากฏใน BUILD
--output build
เมื่อใช้ตัวเลือกนี้ การนำเสนอของแต่ละเป้าหมายจะเสมือนกับว่าโดเมนดังกล่าวเขียนด้วยลายมือในภาษาของ BUILD ระบบจะขยายตัวแปรและการเรียกฟังก์ชันทั้งหมด (เช่น glob, มาโคร) ซึ่งมีประโยชน์ในการดูผลของมาโคร Starlark นอกจากนี้ กฎที่มีผลแต่ละกฎจะรายงานค่า generator_name
และ/หรือ generator_function
) ซึ่งเป็นชื่อของมาโครที่ได้รับการประเมินเพื่อสร้างกฎที่มีประสิทธิภาพ
แม้ว่าเอาต์พุตจะใช้ไวยากรณ์เดียวกับไฟล์ BUILD
แต่ก็ไม่ได้รับประกันว่าจะสร้างไฟล์ BUILD
ที่ถูกต้อง
พิมพ์ป้ายกำกับของเป้าหมายแต่ละรายการ
--output label
ด้วยตัวเลือกนี้ ระบบจะพิมพ์ชุดชื่อ (หรือป้ายกำกับ) ของแต่ละเป้าหมายในกราฟผลลัพธ์ หนึ่งป้ายกำกับต่อบรรทัด ตามลำดับโทโพโลยี (เว้นแต่จะระบุ --noorder_results
โปรดดูหมายเหตุเกี่ยวกับการจัดลำดับผลลัพธ์)
(การจัดลําดับเชิงเรขาคณิตคือการจัดลําดับที่โหนดกราฟปรากฏขึ้นก่อนโหนดที่สืบทอดทั้งหมด) แน่นอนว่ามีการจัดลําดับเชิงเรขาคณิตที่เป็นไปได้หลายแบบสําหรับกราฟ (ลําดับหลังย้อนกลับเป็นเพียงรูปแบบเดียว) ไม่ได้ระบุไว้ว่าระบบจะเลือกรูปแบบใด
เมื่อพิมพ์เอาต์พุตของคำค้นหา somepath
ลำดับที่พิมพ์โหนดจะเป็นลำดับของเส้นทาง
ข้อควรระวัง: ในบางกรณีอาจมีเป้าหมายต่างกัน 2 รายการที่มีป้ายกำกับเดียวกัน เช่น กฎ sh_binary
และไฟล์ srcs
เพียงอย่างเดียว (โดยนัย) อาจเรียกว่า foo.sh
หากผลการค้นหามีเป้าหมายทั้ง 2 รายการนี้ เอาต์พุต (ในรูปแบบ label
) จะดูเหมือนมีสำเนาที่ซ้ำกัน เมื่อใช้รูปแบบ label_kind
(ดูด้านล่าง) ความแตกต่างจะชัดเจนขึ้น เป้าหมาย 2 รายการมีชื่อเดียวกัน แต่รายการหนึ่งมีประเภท sh_binary rule
และอีกรายการมีประเภท source file
พิมพ์ป้ายกำกับและชนิดของเป้าหมายแต่ละรายการ
--output label_kind
เช่นเดียวกับ label
รูปแบบเอาต์พุตนี้จะพิมพ์ป้ายกำกับของเป้าหมายแต่ละรายการในกราฟผลลัพธ์ตามลำดับของโทโพโลยี แต่อยู่ก่อนป้ายกำกับด้วย ประเภท ของเป้าหมาย
พิมพ์เป้าหมายในรูปแบบ Protocol Buffer
--output proto
พิมพ์เอาต์พุตการค้นหาเป็นบัฟเฟอร์โปรโตคอล QueryResult
เป้าหมายที่พิมพ์ในรูปแบบบัฟเฟอร์โปรโตคอลที่คั่นด้วยความยาว
--output streamed_proto
พิมพ์สตรีมบัฟเฟอร์โปรโตคอล Target
แบบแบ่งความยาว วิธีนี้มีประโยชน์ในการ (1) หลีกเลี่ยงข้อจำกัดด้านขนาดของบัฟเฟอร์โปรโตคอลเมื่อมีเป้าหมายจำนวนมากเกินกว่าที่จะพอดีกับ 1 รายการ QueryResult
หรือ (2) เพื่อเริ่มประมวลผลในขณะที่ Bazel ยังส่งออกอยู่
พิมพ์เป้าหมายในรูปแบบโปรโตคอลข้อความ
--output textproto
คล้ายกับ --output proto
แต่จะพิมพ์บัฟเฟอร์โปรโตคอล QueryResult
ในรูปแบบข้อความ
เป้าหมายที่พิมพ์ในรูปแบบ ndjson
--output streamed_jsonproto
คล้ายกับ --output streamed_proto
แต่จะพิมพ์สตรีมบัฟเฟอร์โปรโตคอล Target
ในรูปแบบ ndjson
พิมพ์ป้ายกำกับของเป้าหมายแต่ละรายการตามลําดับ
--output minrank --output maxrank
เช่นเดียวกับ label
รูปแบบเอาต์พุต minrank
และ maxrank
จะพิมพ์ป้ายกำกับของแต่ละเป้าหมายในกราฟผลลัพธ์ แต่แทนที่จะปรากฎตามลำดับโทโพโลยี แต่จะปรากฏในลำดับอันดับที่นำหน้าด้วยหมายเลขอันดับ ซึ่งจะไม่ได้รับผลกระทบจากการเรียงลำดับผลลัพธ์ --[no]order_results
Flag (ดูหมายเหตุเกี่ยวกับการจัดลำดับผลลัพธ์)
รูปแบบนี้มี 2 ตัวแปร ได้แก่ minrank
จะจัดอันดับแต่ละโหนดตามความยาวของเส้นทางที่สั้นที่สุดจากโหนดรากไปถึงโหนดนั้น
โหนด "ราก" (ที่ไม่มีขอบขาเข้า) อยู่ในอันดับ 0 โหนดสืบทอดมาจากอันดับ 1 เป็นต้น (และเช่นเคย จุดขอบจะชี้จากเป้าหมายไปยังสิ่งที่ต้องมี ซึ่งก็คือเป้าหมายที่มันขึ้นอยู่กับ)
maxrank
จะจัดอันดับโหนดแต่ละโหนดตามความยาวของเส้นทางที่ยาวที่สุดจากโหนดรูทไปยังโหนดนั้น อีกครั้ง "รูท" จะมีลําดับ 0 ส่วนโหนดอื่นๆ ทั้งหมดจะมีลําดับมากกว่าลําดับสูงสุดของโหนดก่อนหน้า 1 อันดับ
ระบบจะถือว่าโหนดทั้งหมดในวงจรมีลําดับเท่ากัน (กราฟส่วนใหญ่แสดงแบบวนซ้ำ แต่เป็นวงจรที่เกิดขึ้นได้ง่ายๆ เพราะไฟล์ BUILD
มีรอบที่ผิดพลาด)
รูปแบบเอาต์พุตเหล่านี้มีประโยชน์ในการค้นหาว่ากราฟลึกเพียงใด หากใช้ผลลัพธ์ของการค้นหา deps(x)
, rdeps(x)
หรือ allpaths
ตัวเลขอันดับจะเท่ากับความยาวของเส้นทางที่สั้นที่สุด (โดยมี minrank
) หรือยาวที่สุด (โดยมี maxrank
) จาก x
ไปยังโหนดในอันดับนั้น maxrank
ใช้เพื่อระบุลําดับขั้นตอนการสร้างที่ยาวที่สุดที่จําเป็นต่อการสร้างเป้าหมาย
เช่น กราฟทางด้านซ้ายให้เอาต์พุตทางด้านขวาเมื่อระบุ --output minrank
และ --output maxrank
ตามลำดับ
minrank 0 //c:c 1 //b:b 1 //a:a 2 //b:b.cc 2 //a:a.cc |
maxrank 0 //c:c 1 //b:b 2 //a:a 2 //b:b.cc 3 //a:a.cc |
พิมพ์ตำแหน่งของเป้าหมายแต่ละรายการ
--output location
เช่นเดียวกับ label_kind
ตัวเลือกนี้จะแสดงชนิดและป้ายกำกับของเป้าหมายสำหรับแต่ละเป้าหมายในผลลัพธ์ แต่จะมีสตริงที่อธิบายตำแหน่งของเป้าหมายนั้นอยู่ข้างหน้า เช่น ชื่อไฟล์และหมายเลขบรรทัด รูปแบบจะคล้ายกับเอาต์พุตของ grep
ดังนั้น เครื่องมือที่สามารถแยกวิเคราะห์รูปแบบหลัง (เช่น Emacs หรือ vi) จะใช้เอาต์พุตการค้นหาเพื่อดูชุดการจับคู่ได้เช่นกัน ซึ่งทำให้สามารถใช้เครื่องมือการค้นหาของ Bazel เป็น "grep สำหรับไฟล์ BUILD" ที่รับรู้กราฟความเกี่ยวข้องได้
ข้อมูลสถานที่จะแตกต่างกันไปตามประเภทเป้าหมาย (ดูโอเปอเรเตอร์ kind) สำหรับกฎ ระบบจะพิมพ์ตำแหน่งการประกาศของกฎภายในไฟล์ BUILD
สำหรับไฟล์ต้นฉบับ ระบบจะพิมพ์ตำแหน่งบรรทัดที่ 1 ของไฟล์จริง สำหรับไฟล์ที่สร้างขึ้น ระบบจะพิมพ์ตำแหน่งของกฎที่สร้าง (เครื่องมือค้นหามีข้อมูลไม่เพียงพอที่จะค้นหาตำแหน่งจริงของไฟล์ที่สร้างขึ้น และไม่ว่าในกรณีใดก็ตาม ไฟล์ดังกล่าวอาจไม่อยู่หากยังไม่ได้ทำการบิลด์)
พิมพ์ชุดแพ็กเกจ
--output package
ตัวเลือกนี้จะพิมพ์ชื่อแพ็กเกจทั้งหมดที่เป้าหมายบางรายการในชุดผลลัพธ์อยู่ ระบบจะพิมพ์ชื่อตามลําดับพจนานุกรม โดยจะไม่รวมรายการที่ซ้ำกัน อย่างเป็นทางการ นี่คือการคาดการณ์จากชุดของป้ายกำกับ (แพ็กเกจ เป้าหมาย) ไปยังแพ็กเกจ
แพ็กเกจในที่เก็บภายนอกจัดรูปแบบเป็น @repo//foo/bar
ในขณะที่แพ็กเกจในที่เก็บหลักจะมีการจัดรูปแบบเป็น foo/bar
เมื่อใช้ร่วมกับการค้นหา deps(...)
ตัวเลือกเอาต์พุตนี้สามารถใช้เพื่อค้นหาชุดแพ็กเกจที่ต้องเลือกเพื่อสร้างชุดเป้าหมายหนึ่งๆ
แสดงกราฟของผลลัพธ์
--output graph
ตัวเลือกนี้จะทําให้ผลการค้นหาแสดงเป็นกราฟที่มีทิศทางในรูปแบบ AT&T GraphViz ที่ได้รับความนิยม โดยปกติแล้วระบบจะบันทึกผลลัพธ์ลงในไฟล์ เช่น .png
หรือ .svg
(หากยังไม่ได้ติดตั้งโปรแกรม dot
ในเวิร์กสเตชัน คุณสามารถติดตั้งได้โดยใช้คำสั่ง sudo apt-get install graphviz
)
ดูตัวอย่างการเรียกใช้ได้ที่ส่วนตัวอย่างด้านล่าง
รูปแบบเอาต์พุตนี้มีประโยชน์อย่างยิ่งสำหรับการค้นหา allpaths
, deps
หรือ rdeps
ซึ่งผลลัพธ์จะมีชุดเส้นทาง ซึ่งมองไม่เห็นได้อย่างง่ายดายเมื่อแสดงผลในรูปแบบเชิงเส้น เช่น --output label
กราฟจะแสดงผลในรูปแบบแยกตัวประกอบโดยค่าเริ่มต้น กล่าวคือ โหนดที่เท่าเทียมกันในตำแหน่งโทโพโลยีจะรวมกันเป็นโหนดเดียวที่มีป้ายกำกับหลายป้าย วิธีนี้ทําให้กราฟกระชับขึ้นและอ่านง่ายขึ้น เนื่องจากกราฟผลลัพธ์ทั่วไปมีรูปแบบที่ซ้ำกันสูง ตัวอย่างเช่น กฎ java_library
อาจขึ้นอยู่กับไฟล์ซอร์สโค้ด Java หลายร้อยไฟล์ที่สร้างขึ้นโดย genrule
เดียวกัน ในกราฟที่แยกปัจจัย ไฟล์เหล่านี้ทั้งหมดจะแสดงด้วยโหนดเดียว ลักษณะการทำงานนี้อาจปิดใช้ได้ด้วยตัวเลือก --nograph:factored
--graph:node_limit n
ตัวเลือกนี้จะระบุความยาวสูงสุดของสตริงป้ายกำกับสำหรับโหนดกราฟในเอาต์พุต ระบบจะตัดป้ายกำกับที่ยาวกว่าออก ส่วน -1 จะปิดใช้การตัด ป้ายกำกับโหนดอาจยาวมากเนื่องจากรูปแบบที่แยกปัจจัยซึ่งปกติแล้วใช้ในการพิมพ์กราฟ GraphViz จะจัดการกับป้ายกำกับที่ยาวเกิน 1, 024 อักขระซึ่งเป็นค่าเริ่มต้นของตัวเลือกนี้ไม่ได้ ตัวเลือกนี้จะไม่มีผล เว้นแต่จะใช้ --output=graph
--[no]graph:factored
โดยค่าเริ่มต้น กราฟจะแสดงในรูปแบบแยกตัวประกอบตามที่อธิบายไว้ด้านบน
เมื่อระบุ --nograph:factored
ระบบจะพิมพ์กราฟโดยไม่มีการแยกตัวประกอบ ซึ่งทำให้การแสดงข้อมูลผ่านภาพโดยใช้ GraphViz ใช้งานได้จริง แต่รูปแบบที่ง่ายกว่าอาจทำให้เครื่องมืออื่นๆ (เช่น grep) ประมวลผลได้ง่ายขึ้น ตัวเลือกนี้ไม่มีผลเว้นแต่จะมีการใช้ --output=graph
XML
--output xml
ตัวเลือกนี้จะทําให้ระบบพิมพ์เป้าหมายที่ได้ในรูปแบบ XML เอาต์พุตจะเริ่มต้นด้วยส่วนหัว XML เช่นนี้
<?xml version="1.0" encoding="UTF-8"?>
<query version="2">
จากนั้นตามด้วยองค์ประกอบ XML สําหรับเป้าหมายแต่ละรายการในกราฟผลลัพธ์ตามลําดับเชิงเรขาคณิต (เว้นแต่จะมีการขอผลลัพธ์ที่ไม่มีลําดับ) แล้วปิดท้ายด้วย
</query>
ส่งรายการแบบง่ายสำหรับเป้าหมายประเภท file
ต่อไปนี้
<source-file name='//foo:foo_main.cc' .../>
<generated-file name='//foo:libfoo.so' .../>
แต่สำหรับกฎ XML จะมีโครงสร้างและมีคำจำกัดความของแอตทริบิวต์ทั้งหมดของกฎ ซึ่งรวมถึงแอตทริบิวต์ที่ไม่มีการระบุค่าอย่างชัดเจนในไฟล์ BUILD
ของกฎ
นอกจากนี้ ผลลัพธ์จะมีองค์ประกอบ rule-input
และ rule-output
เพื่อให้สร้างโทโพโลยีของกราฟการขึ้นต่อกันใหม่ได้โดยไม่ต้องทราบว่า ตัวอย่างเช่น องค์ประกอบของแอตทริบิวต์ srcs
เป็นทรัพยากร Dependency แบบส่งต่อ (ข้อกำหนดเบื้องต้น) และเนื้อหาของแอตทริบิวต์ outs
เป็นทรัพยากร Dependency แบบย้อนกลับ (ผู้บริโภค)
ระบบจะระงับองค์ประกอบ rule-input
สำหรับทรัพยากร Dependency ที่ไม่ชัดแจ้งหากมีการระบุ --noimplicit_deps
<rule class='cc_binary rule' name='//foo:foo' ...>
<list name='srcs'>
<label value='//foo:foo_main.cc'/>
<label value='//foo:bar.cc'/>
...
</list>
<list name='deps'>
<label value='//common:common'/>
<label value='//collections:collections'/>
...
</list>
<list name='data'>
...
</list>
<int name='linkstatic' value='0'/>
<int name='linkshared' value='0'/>
<list name='licenses'/>
<list name='distribs'>
<distribution value="INTERNAL" />
</list>
<rule-input name="//common:common" />
<rule-input name="//collections:collections" />
<rule-input name="//foo:foo_main.cc" />
<rule-input name="//foo:bar.cc" />
...
</rule>
องค์ประกอบ XML ทั้งหมดของเป้าหมายมีแอตทริบิวต์ name
ซึ่งมีค่าเป็นป้ายกำกับของเป้าหมาย และแอตทริบิวต์ location
ซึ่งมีค่าเป็นตําแหน่งของเป้าหมายตามที่พิมพ์โดย --output location
--[no]xml:line_numbers
โดยค่าเริ่มต้น ตำแหน่งที่แสดงในเอาต์พุต XML จะมีหมายเลขบรรทัดอยู่
เมื่อระบุ --noxml:line_numbers
แล้ว จะไม่มีการพิมพ์หมายเลขบรรทัด
--[no]xml:default_values
โดยค่าเริ่มต้น เอาต์พุต XML จะไม่รวมแอตทริบิวต์กฎที่มีค่าเป็นค่าเริ่มต้นสำหรับแอตทริบิวต์ประเภทนั้น (เช่น หากไม่ได้ระบุไว้ในไฟล์ BUILD
หรือมีการระบุค่าเริ่มต้นไว้อย่างชัดแจ้ง) ตัวเลือกนี้จะทำให้ค่าแอตทริบิวต์ดังกล่าวรวมอยู่ในเอาต์พุต XML
นิพจน์ทั่วไป
นิพจน์ทั่วไปในภาษาคําค้นหาใช้ไลบรารีนิพจน์ทั่วไปของ Java คุณจึงใช้ไวยากรณ์แบบเต็มสําหรับ java.util.regex.Pattern
ได้
การค้นหาด้วยที่เก็บภายนอก
หากบิลด์ใช้กฎจากที่เก็บข้อมูลภายนอก (กำหนดไว้ในไฟล์ WORKSPACE) ผลการค้นหาจะรวมรายการต่อไปนี้ เช่น หาก //foo:bar
ขึ้นอยู่กับ //external:some-lib
และ //external:some-lib
เชื่อมโยงกับ @other-repo//baz:lib
แล้ว bazel query 'deps(//foo:bar)'
จะแสดงทั้ง @other-repo//baz:lib
และ //external:some-lib
เป็นทรัพยากร Dependency
ที่เก็บภายนอกนั้นไม่ใช่ทรัพยากร Dependency ของบิลด์ กล่าวคือ ในตัวอย่างด้านบน //external:other-repo
ไม่ใช่ทรัพยากร Dependency แต่สามารถค้นหาได้ในฐานะสมาชิกของแพ็กเกจ //external
ดังนี้
# Querying over all members of //external returns the repository.
bazel query 'kind(http_archive, //external:*)'
//external:other-repo
# ...but the repository is not a dependency.
bazel query 'kind(http_archive, deps(//foo:bar))'
INFO: Empty results