cquery เป็นตัวแปรของ query ที่จัดการ
select() และผลกระทบของตัวเลือกการสร้างในกราฟการสร้าง
ได้อย่างถูกต้อง
เครื่องมือนี้จะทำงานโดยใช้ผลลัพธ์ของระยะการวิเคราะห์
ของ Bazel,
ซึ่งผสานรวมผลกระทบเหล่านี้ ในทางตรงกันข้าม query จะทำงานโดยใช้ผลลัพธ์ของระยะการโหลดของ Bazel ก่อนที่จะมีการประเมินตัวเลือก
ตัวอย่าง
$ cat > tree/BUILD <<EOF
sh_library(
name = "ash",
deps = select({
":excelsior": [":manna-ash"],
":americana": [":white-ash"],
"//conditions:default": [":common-ash"],
}),
)
sh_library(name = "manna-ash")
sh_library(name = "white-ash")
sh_library(name = "common-ash")
config_setting(
name = "excelsior",
values = {"define": "species=excelsior"},
)
config_setting(
name = "americana",
values = {"define": "species=americana"},
)
EOF
# Traditional query: query doesn't know which select() branch you will choose, # so it conservatively lists all of possible choices, including all used config_settings. $ bazel query "deps(//tree:ash)" --noimplicit_deps //tree:americana //tree:ash //tree:common-ash //tree:excelsior //tree:manna-ash //tree:white-ash # cquery: cquery lets you set build options at the command line and chooses # the exact dependencies that implies (and also the config_setting targets). $ bazel cquery "deps(//tree:ash)" --define species=excelsior --noimplicit_deps //tree:ash (9f87702) //tree:manna-ash (9f87702) //tree:americana (9f87702) //tree:excelsior (9f87702)
ผลลัพธ์แต่ละรายการจะมีตัวระบุที่ไม่ซ้ำกัน (9f87702) ของ
การกำหนดค่าที่ใช้สร้างเป้าหมาย
เนื่องจาก cquery ทำงานโดยใช้กราฟเป้าหมายที่กำหนดค่าไว้ เครื่องมือนี้จึงไม่มีข้อมูลเชิงลึกเกี่ยวกับอาร์ติแฟกต์ เช่น การดำเนินการสร้าง และไม่มีสิทธิ์เข้าถึงกฎ [test_suite](/versions/6.2.0/reference/be/general#test_suite) เนื่องจากกฎเหล่านี้ไม่ใช่เป้าหมายที่กำหนดค่าไว้ สำหรับกฎแรก โปรดดู [aquery](/versions/6.2.0/docs/aquery)
ไวยากรณ์พื้นฐาน
การเรียกใช้ cquery แบบง่ายจะมีลักษณะดังนี้
bazel cquery "function(//target)"
นิพจน์การค้นหา "function(//target)" ประกอบด้วยองค์ประกอบต่อไปนี้
function(...)คือฟังก์ชันที่จะเรียกใช้ในเป้าหมายcqueryรองรับฟังก์ชันส่วนใหญ่ ของquery's functions รวมถึงฟังก์ชันใหม่ๆ อีก 2-3 ฟังก์ชัน//targetคือนิพจน์ที่ส่งไปยังฟังก์ชัน ในตัวอย่างนี้ นิพจน์คือเป้าหมายแบบง่าย แต่ภาษาการค้นหายังอนุญาตให้ซ้อนฟังก์ชันได้ด้วย ดูตัวอย่างได้ที่วิธีการค้นหา
cquery ต้องมีเป้าหมายที่จะเรียกใช้ผ่านระยะการโหลดและการวิเคราะห์
cquery จะแยกวิเคราะห์เป้าหมายที่ระบุไว้ในนิพจน์การค้นหา เว้นแต่จะระบุไว้เป็นอย่างอื่น ดู --universe_scope
สำหรับการค้นหาการพึ่งพิงของเป้าหมายการสร้างระดับบนสุด
การกำหนดค่า
บรรทัด
//tree:ash (9f87702)
หมายความว่า //tree:ash สร้างขึ้นในการกำหนดค่าที่มีรหัส 9f87702 สำหรับเป้าหมายส่วนใหญ่ รหัสนี้จะเป็นแฮชแบบทึบของค่าตัวเลือกการบิลด์ที่กำหนดการกำหนดค่า
หากต้องการดูเนื้อหาทั้งหมดของการกำหนดค่า ให้เรียกใช้คำสั่งต่อไปนี้
$ bazel config 9f87702
การกำหนดค่าโฮสต์ใช้รหัสพิเศษ (HOST) ไฟล์แหล่งที่มาที่ไม่ได้สร้างขึ้น เช่น ไฟล์ที่มักพบใน srcs จะใช้รหัสพิเศษ (null) (เนื่องจากไฟล์เหล่านี้ไม่จำเป็นต้องกำหนดค่า)
9f87702 เป็นคำนำหน้าของรหัสที่สมบูรณ์ เนื่องจากรหัสที่สมบูรณ์เป็นแฮช SHA-256 ซึ่งมีความยาวและติดตามได้ยาก cquery เข้าใจคำนำหน้าที่ถูกต้องของรหัสที่สมบูรณ์ เช่นเดียวกับ
แฮชแบบสั้นของ Git.
หากต้องการดูรหัสที่สมบูรณ์ ให้เรียกใช้ $ bazel config
การประเมินรูปแบบเป้าหมาย
//foo มีความหมายที่แตกต่างกันสำหรับ cquery และ query เนื่องจาก cquery ประเมินเป้าหมาย ที่กำหนดค่าไว้ และกราฟการบิลด์อาจมี //foo หลายเวอร์ชันที่กำหนดค่าไว้
สำหรับ cquery รูปแบบเป้าหมายในนิพจน์การค้นหาจะประเมินเป็นเป้าหมายที่กำหนดค่าไว้ทุกรายการที่มีป้ายกำกับที่ตรงกับรูปแบบนั้น เอาต์พุตเป็น
แบบดีเทอร์มินิสติก แต่ cquery ไม่รับประกันการจัดลำดับนอกเหนือจาก
สัญญาการจัดลำดับการค้นหาหลัก
ซึ่งจะสร้างผลลัพธ์ที่ละเอียดกว่าสำหรับนิพจน์การค้นหาเมื่อเทียบกับ query
ตัวอย่างเช่น คำสั่งต่อไปนี้อาจสร้างผลลัพธ์หลายรายการ
# Analyzes //foo in the target configuration, but also analyzes # //genrule_with_foo_as_tool which depends on a host-configured # //foo. So there are two configured target instances of //foo in # the build graph. $ bazel cquery //foo --universe_scope=//foo,//genrule_with_foo_as_tool //foo (9f87702) //foo (HOST)
หากต้องการประกาศอินสแตนซ์ที่จะค้นหาอย่างแม่นยำ ให้ใช้
ฟังก์ชัน config
ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบเป้าหมายได้ในเอกสารประกอบเกี่ยวกับรูปแบบเป้าหมายของ query's target pattern
documentation
ฟังก์ชัน
จากชุดฟังก์ชัน
ที่ query รองรับ cquery รองรับฟังก์ชันทั้งหมด ยกเว้น
allrdeps,
buildfiles,
rbuildfiles,
siblings,
tests และ
visible
นอกจากนี้ cquery ยังมีฟังก์ชันใหม่ต่อไปนี้
config
expr ::= config(expr, word)
โอเปอเรเตอร์ config พยายามค้นหาเป้าหมายที่กำหนดค่าไว้สำหรับป้ายกำกับที่ระบุโดยอาร์กิวเมนต์แรกและการกำหนดค่าที่ระบุโดยอาร์กิวเมนต์ที่ 2
ค่าที่ใช้ได้สำหรับอาร์กิวเมนต์ที่ 2 คือ target, host, null หรือแฮชการกำหนดค่าที่กำหนดเอง
คุณสามารถดึงแฮชได้จาก $
bazel config หรือเอาต์พุตของ cquery ก่อนหน้า
ตัวอย่าง
$ bazel cquery "config(//bar, host)" --universe_scope=//foo
$ bazel cquery "deps(//foo)" //bar (HOST) //baz (3732cc8) $ bazel cquery "config(//baz, 3732cc8)"
หากไม่พบผลลัพธ์ทั้งหมดของอาร์กิวเมนต์แรกในการกำหนดค่าที่ระบุ ระบบจะแสดงผลเฉพาะผลลัพธ์ที่พบ หากไม่พบผลลัพธ์ในการกำหนดค่าที่ระบุ การค้นหาจะล้มเหลว
ตัวเลือก
ตัวเลือกบิลด์
cquery ทำงานโดยใช้การสร้าง Bazel ปกติ จึงสืบทอดชุด
ตัวเลือกที่ใช้ได้ระหว่างการสร้าง
การใช้ตัวเลือก cquery
--universe_scope (รายการที่คั่นด้วยคอมมา)
การพึ่งพิงของเป้าหมายที่กำหนดค่าไว้มักจะผ่าน การเปลี่ยน, ซึ่งทำให้การกำหนดค่าแตกต่างจากเป้าหมายที่พึ่งพิง แฟล็กนี้ช่วยให้คุณค้นหาเป้าหมายได้ราวกับว่าเป้าหมายนั้นสร้างขึ้นเป็นการพึ่งพิงหรือการพึ่งพิงแบบทรานซิทีฟของเป้าหมายอื่น ตัวอย่าง
# x/BUILD
genrule(
name = "my_gen",
srcs = ["x.in"],
outs = ["x.cc"],
cmd = "$(locations :tool) $< >$@",
tools = [":tool"],
)
cc_library(
name = "tool",
)
Genrule กำหนดค่าเครื่องมือในการ กำหนดค่าโฮสต์ ดังนั้นการค้นหาต่อไปนี้จะสร้างเอาต์พุตต่อไปนี้
| การค้นหา | เป้าหมายที่สร้างขึ้น | เอาต์พุต |
|---|---|---|
| bazel cquery "//x:tool" | //x:tool | //x:tool(targetconfig) |
| bazel cquery "//x:tool" --universe_scope="//x:my_gen" | //x:my_gen | //x:tool(hostconfig) |
หากตั้งค่าแฟล็กนี้ ระบบจะสร้างเนื้อหาของแฟล็ก หากไม่ได้ตั้งค่าไว้ ระบบจะสร้างเป้าหมายทั้งหมด
ที่ระบุไว้ในนิพจน์การค้นหาแทน ระบบจะใช้การปิดแบบทรานซิทีฟของเป้าหมายที่สร้างขึ้นเป็นจักรวาลของการค้นหา ไม่ว่าจะด้วยวิธีใด เป้าหมายที่จะสร้างขึ้นต้องสร้างได้ในระดับบนสุด (นั่นคือ เข้ากันได้กับตัวเลือกระดับบนสุด) cquery จะแสดงผลลัพธ์ในการปิดแบบทรานซิทีฟของเป้าหมายระดับบนสุดเหล่านี้
แม้ว่าการสร้างเป้าหมายทั้งหมดในนิพจน์การค้นหาในระดับบนสุดจะเป็นไปได้ แต่การไม่ทำเช่นนั้นอาจเป็นประโยชน์ ตัวอย่างเช่น การตั้งค่า --universe_scope อย่างชัดแจ้งอาจป้องกันไม่ให้สร้างเป้าหมายหลายครั้งในการกำหนดค่าที่คุณไม่สนใจ นอกจากนี้ยังช่วยระบุเวอร์ชันการกำหนดค่าของเป้าหมายที่คุณต้องการได้ด้วย (เนื่องจากปัจจุบันยังไม่สามารถระบุเวอร์ชันนี้ได้อย่างสมบูรณ์ด้วยวิธีอื่น) คุณควรตั้งค่าแฟล็กนี้หากนิพจน์การค้นหามีความซับซ้อนมากกว่า deps(//foo)
--implicit_deps (บูลีน, ค่าเริ่มต้น=True)
การตั้งค่าแฟล็กนี้เป็น "เท็จ" จะกรองผลลัพธ์ทั้งหมดที่ไม่ได้ตั้งค่าอย่างชัดแจ้งในไฟล์ BUILD และตั้งค่าไว้ที่อื่นโดย Bazel ซึ่งรวมถึงการกรองชุดเครื่องมือที่แก้ไขแล้ว
--tool_deps (บูลีน, ค่าเริ่มต้น=True)
การตั้งค่าแฟล็กนี้เป็น "เท็จ" จะกรองเป้าหมายที่กำหนดค่าไว้ทั้งหมดซึ่ง
เส้นทางจากเป้าหมายที่ค้นหาไปยังเป้าหมายเหล่านั้นข้ามการเปลี่ยนระหว่างการกำหนดค่า
เป้าหมายและการกำหนดค่า
ที่ไม่ใช่เป้าหมาย
หากเป้าหมายที่ค้นหาอยู่ในการกำหนดค่าเป้าหมาย การตั้งค่า --notool_deps จะแสดงผลเฉพาะเป้าหมายที่อยู่ในการกำหนดค่าเป้าหมายด้วย หากเป้าหมายที่ค้นหาอยู่ในการกำหนดค่าที่ไม่ใช่เป้าหมาย การตั้งค่า --notool_deps จะแสดงผลเฉพาะเป้าหมายที่อยู่ในการกำหนดค่าที่ไม่ใช่เป้าหมายด้วย โดยทั่วไปการตั้งค่านี้จะไม่ส่งผลต่อการกรองชุดเครื่องมือที่แก้ไขแล้ว
--include_aspects (บูลีน, ค่าเริ่มต้น=True)
แง่มุมต่างๆ สามารถเพิ่มทรัพยากร Dependency เพิ่มเติมในการสร้าง โดยค่าเริ่มต้น cquery จะไม่ติดตามแง่มุมต่างๆ เนื่องจากแง่มุมเหล่านี้ทำให้กราฟที่ค้นหาได้มีขนาดใหญ่ขึ้น ซึ่งใช้หน่วยความจำมากขึ้น แต่การติดตามแง่มุมต่างๆ จะสร้างผลลัพธ์ที่แม่นยำมากขึ้น
หากคุณไม่กังวลเกี่ยวกับผลกระทบต่อหน่วยความจำของการค้นหาขนาดใหญ่ ให้เปิดใช้แฟล็กนี้โดยค่าเริ่มต้นใน bazelrc
หากคุณค้นหาโดยปิดใช้แง่มุมต่างๆ คุณอาจพบปัญหาที่เป้าหมาย X ล้มเหลวขณะที่สร้างเป้าหมาย Y แต่ cquery somepath(Y, X) และ cquery deps(Y) | grep 'X' ไม่แสดงผลลัพธ์เนื่องจากทรัพยากร Dependency เกิดขึ้นผ่านแง่มุมต่างๆ
รูปแบบเอาต์พุต
โดยค่าเริ่มต้น cquery จะแสดงผลลัพธ์ในรายการคู่ป้ายกำกับและการกำหนดค่าที่จัดเรียงตามการพึ่งพิง นอกจากนี้ยังมีตัวเลือกอื่นๆ สำหรับการแสดงผลลัพธ์ด้วย
ทรานซิชัน
--transitions=lite --transitions=full
การเปลี่ยนการกำหนดค่า ใช้เพื่อสร้างเป้าหมายที่อยู่ใต้เป้าหมายระดับบนสุดในการกำหนดค่าที่แตกต่างจากเป้าหมายระดับบนสุด
ตัวอย่างเช่น เป้าหมายอาจบังคับให้มีการเปลี่ยนไปใช้การกำหนดค่าโฮสต์ในการพึ่งพิงทั้งหมดในแอตทริบิวต์ tools การเปลี่ยนเหล่านี้เรียกว่าการเปลี่ยนแอตทริบิวต์ กฎยังบังคับให้มีการเปลี่ยนการกำหนดค่าของตัวเองได้ด้วย ซึ่งเรียกว่าการเปลี่ยนคลาสกฎ รูปแบบเอาต์พุตนี้จะแสดงข้อมูลเกี่ยวกับการเปลี่ยนเหล่านี้ เช่น ประเภทของการเปลี่ยนและผลกระทบของการเปลี่ยนต่อตัวเลือกการสร้าง
รูปแบบเอาต์พุตนี้จะทริกเกอร์โดยแฟล็ก --transitions ซึ่งตั้งค่าเป็น NONE โดยค่าเริ่มต้น คุณสามารถตั้งค่าเป็นโหมด FULL หรือ LITE โหมด FULL จะแสดงข้อมูลเกี่ยวกับการเปลี่ยนคลาสกฎและการเปลี่ยนแอตทริบิวต์ รวมถึงการเปรียบเทียบตัวเลือกโดยละเอียดก่อนและหลังการเปลี่ยน โหมด LITE จะแสดงข้อมูลเดียวกันโดยไม่มีการเปรียบเทียบตัวเลือก
เอาต์พุตข้อความโปรโตคอล
--output=proto
ตัวเลือกนี้จะทำให้ระบบพิมพ์เป้าหมายที่ได้ในรูปแบบบัฟเฟอร์โปรโตคอลไบนารี คำจำกัดความของบัฟเฟอร์โปรโตคอลดูได้ที่ src/main/protobuf/analysis.proto
CqueryResult เป็นข้อความระดับบนสุดที่มีผลลัพธ์ของ cquery โดยมีรายการข้อความ ConfiguredTarget และรายการข้อความ Configuration ConfiguredTarget แต่ละรายการจะมี configuration_id ที่มีค่าเท่ากับ
ค่าของช่อง id จากข้อความ Configuration ที่เกี่ยวข้อง
--[no]proto:include_configurations
โดยค่าเริ่มต้น ผลลัพธ์ cquery จะแสดงข้อมูลการกำหนดค่าเป็นส่วนหนึ่งของเป้าหมายที่กำหนดค่าไว้แต่ละรายการ หากต้องการละเว้นข้อมูลนี้และรับเอาต์พุตโปรโตที่จัดรูปแบบเหมือนกับเอาต์พุตโปรโตของ query ทุกประการ ให้ตั้งค่าแฟล็กนี้เป็น "เท็จ"
ดูตัวเลือกอื่นๆ ที่เกี่ยวข้องกับเอาต์พุตโปรโตได้ในเอกสารประกอบเกี่ยวกับเอาต์พุตโปรโตของ query
เอาต์พุตกราฟ
--output=graph
ตัวเลือกนี้จะสร้างเอาต์พุตเป็นไฟล์ .dot ที่เข้ากันได้กับ Graphviz ดูรายละเอียดได้ในเอกสารประกอบเกี่ยวกับเอาต์พุตกราฟของ query's
cquery
ยังรองรับ --graph:node_limit และ
--graph:factored ด้วย
เอาต์พุตไฟล์
--output=files
ตัวเลือกนี้จะพิมพ์รายการไฟล์เอาต์พุตที่สร้างโดยเป้าหมายแต่ละรายการที่ตรงกับการค้นหา ซึ่งคล้ายกับรายการที่พิมพ์เมื่อสิ้นสุดการเรียกใช้ bazel build เอาต์พุตจะมีเฉพาะไฟล์ที่ประกาศไว้ในกลุ่มเอาต์พุตที่ขอ
ตามที่กำหนดโดย
--output_groups แฟล็ก
แต่จะรวมไฟล์แหล่งที่มา
config(..., target).
การกำหนดรูปแบบเอาต์พุตโดยใช้ Starlark
--output=starlark
รูปแบบเอาต์พุตนี้จะเรียกใช้ฟังก์ชัน Starlark
สำหรับเป้าหมายที่กำหนดค่าไว้แต่ละรายการในผลการค้นหา และพิมพ์ค่า
ที่แสดงผลโดยการเรียกใช้ แฟล็ก --starlark:file จะระบุตำแหน่งของไฟล์ Starlark ที่กำหนดฟังก์ชันชื่อ format ที่มีพารามิเตอร์เดียวคือ target ระบบจะเรียกใช้ฟังก์ชันนี้สำหรับเป้าหมาย
ในผลการค้นหา หรือคุณจะระบุเนื้อหาของฟังก์ชันที่ประกาศเป็น def format(target): return expr โดยใช้แฟล็ก --starlark:expr เพื่อความสะดวกก็ได้
ภาษา Starlark ของ 'cquery'
สภาพแวดล้อม Starlark ของ cquery จะแตกต่างจากไฟล์ BUILD หรือ .bzl โดยมี ค่าคงที่และฟังก์ชันในตัวหลักทั้งหมดของ Starlark รวมถึงฟังก์ชันเฉพาะของ cquery บางฟังก์ชันที่อธิบายไว้ด้านล่าง แต่ไม่มี (เช่น) glob native หรือ rule และไม่รองรับคำสั่งโหลด
build_options(target)
build_options(target) จะแสดงผลแผนที่ที่มีคีย์เป็นตัวระบุตัวเลือกการสร้าง (ดู
การกำหนดค่า)
และค่าเป็นค่า Starlark ระบบจะละเว้นตัวเลือกการสร้างที่มีค่าไม่ใช่ค่า Starlark ที่ถูกต้องจากแผนที่นี้
หากเป้าหมายเป็นไฟล์อินพุต build_options(target) จะแสดงผล None เนื่องจากเป้าหมายไฟล์อินพุตมีการกำหนดค่าเป็น Null
providers(target)
providers(target) จะแสดงผลแผนที่ที่มีคีย์เป็นชื่อของ
ผู้ให้บริการ
(เช่น "DefaultInfo") และค่าเป็นค่า Starlark ระบบจะละเว้นผู้ให้บริการที่มีค่าไม่ใช่ค่า Starlark ที่ถูกต้องจากแผนที่นี้
ตัวอย่าง
พิมพ์รายการชื่อฐานของไฟล์ทั้งหมดที่สร้างโดย //foo โดยคั่นด้วยช่องว่าง
bazel cquery //foo --output=starlark \
--starlark:expr="' '.join([f.basename for f in target.files.to_list()])"
พิมพ์รายการเส้นทางของไฟล์ทั้งหมดที่สร้างโดยเป้าหมาย กฎ ใน //bar และแพ็กเกจย่อย โดยคั่นด้วยช่องว่าง
bazel cquery 'kind(rule, //bar/...)' --output=starlark \
--starlark:expr="' '.join([f.path for f in target.files.to_list()])"
พิมพ์รายการคำย่อของทุกการดำเนินการที่ลงทะเบียนโดย //foo
bazel cquery //foo --output=starlark \
--starlark:expr="[a.mnemonic for a in target.actions]"
พิมพ์รายการเอาต์พุตการคอมไพล์ที่ลงทะเบียนโดย cc_library //baz
bazel cquery //baz --output=starlark \
--starlark:expr="[f.path for f in target.output_groups.compilation_outputs.to_list()]"
พิมพ์ค่าของตัวเลือกบรรทัดคำสั่ง --javacopt เมื่อสร้าง //foo
bazel cquery //foo --output=starlark \
--starlark:expr="build_options(target)['//command_line_option:javacopt']"
พิมพ์ป้ายกำกับของเป้าหมายแต่ละรายการที่มีเอาต์พุตเพียงรายการเดียว ตัวอย่างนี้ใช้ฟังก์ชัน Starlark ที่กำหนดไว้ในไฟล์
$ cat example.cquery
def has_one_output(target):
return len(target.files.to_list()) == 1
def format(target):
if has_one_output(target):
return target.label
else:
return ""
$ bazel cquery //baz --output=starlark --starlark:file=example.cquery
พิมพ์ป้ายกำกับของเป้าหมายแต่ละรายการที่เป็น Python 3 อย่างเคร่งครัด ตัวอย่างนี้ใช้ฟังก์ชัน Starlark ที่กำหนดไว้ในไฟล์
$ cat example.cquery
def format(target):
p = providers(target)
py_info = p.get("PyInfo")
if py_info and py_info.has_py3_only_sources:
return target.label
else:
return ""
$ bazel cquery //baz --output=starlark --starlark:file=example.cquery
แยกค่าจากผู้ให้บริการที่กำหนดโดยผู้ใช้
$ cat some_package/my_rule.bzl
MyRuleInfo = provider(fields={"color": "the name of a color"})
def _my_rule_impl(ctx):
...
return [MyRuleInfo(color="red")]
my_rule = rule(
implementation = _my_rule_impl,
attrs = {...},
)
$ cat example.cquery
def format(target):
p = providers(target)
my_rule_info = p.get("//some_package:my_rule.bzl%MyRuleInfo'")
if my_rule_info:
return my_rule_info.color
return ""
$ bazel cquery //baz --output=starlark --starlark:file=example.cquery
cquery เทียบกับ query
cquery และ query ช่วยเสริมกันและกันและมีความโดดเด่นใน
ตลาดเฉพาะกลุ่มที่แตกต่างกัน โปรดพิจารณาสิ่งต่อไปนี้เพื่อตัดสินใจว่าเครื่องมือใดเหมาะกับคุณ
cqueryจะติดตาม Branchselect()ที่เฉพาะเจาะจงเพื่อสร้างกราฟที่คุณสร้างขึ้นอย่างแม่นยำqueryไม่ทราบว่าบิลด์เลือก Branch ใด จึงประมาณค่ามากเกินไปโดยรวม Branch ทั้งหมด- ความแม่นยำของ
cquery's ต้องสร้างกราฟมากกว่าที่queryสร้าง โดยเฉพาะอย่างยิ่งcqueryจะประเมิน เป้าหมายที่กำหนดค่าไว้ ขณะที่queryจะประเมิน เป้าหมาย เท่านั้น ซึ่งใช้เวลามากขึ้นและใช้หน่วยความจำมากขึ้น - การตีความ
ของภาษาการค้นหาของ
cqueryทำให้เกิดความกำกวม ที่queryหลีกเลี่ยง ตัวอย่างเช่น หาก"//foo"มีอยู่ในการกำหนดค่า 2 รายการ ควรใช้รายการใดcquery "deps(//foo)"ฟังก์ชัน[config](#config)ช่วยได้ในกรณีนี้ cqueryเป็นเครื่องมือใหม่กว่า จึงไม่รองรับกรณีการใช้งานบางกรณี ดูรายละเอียดได้ที่ปัญหาที่ทราบ
ปัญหาที่ทราบ
เป้าหมายทั้งหมดที่ cquery "สร้าง" ต้องมีการกำหนดค่าเดียวกัน
ก่อนที่จะประเมินการค้นหา cquery จะทริกเกอร์การสร้างจนถึงจุดก่อนที่การดำเนินการสร้างจะทำงาน ระบบจะเลือกเป้าหมายที่
"สร้าง" โดยค่าเริ่มต้นจากป้ายกำกับทั้งหมดที่ปรากฏในนิพจน์การค้นหา (คุณสามารถลบล้างการเลือกนี้ได้
ด้วย --universe_scope) เป้าหมายเหล่านี้
ต้องมีการกำหนดค่าเดียวกัน
แม้ว่าเป้าหมายเหล่านี้จะใช้การกำหนดค่า "เป้าหมาย" ระดับบนสุดร่วมกันโดยทั่วไป
กฎสามารถเปลี่ยนการกำหนดค่าของตัวเองได้ด้วย
การเปลี่ยนขอบขาเข้า
ซึ่งเป็นจุดที่ cquery มีข้อบกพร่อง
วิธีแก้ปัญหา: หากเป็นไปได้ ให้ตั้งค่า --universe_scope เป็นขอบเขตที่เข้มงวดมากขึ้น ตัวอย่าง
# This command attempts to build the transitive closures of both //foo and # //bar. //bar uses an incoming edge transition to change its --cpu flag. $ bazel cquery 'somepath(//foo, //bar)' ERROR: Error doing post analysis query: Top-level targets //foo and //bar have different configurations (top-level targets with different configurations is not supported) # This command only builds the transitive closure of //foo, under which # //bar should exist in the correct configuration. $ bazel cquery 'somepath(//foo, //bar)' --universe_scope=//foo
ไม่รองรับ --output=xml
เอาต์พุตที่ไม่แน่นอน
cquery จะไม่ล้างกราฟการสร้างจากคำสั่งก่อนหน้าโดยอัตโนมัติ จึงมีแนวโน้มที่จะดึงผลลัพธ์จากการค้นหาที่ผ่านมา ตัวอย่างเช่น genquery จะใช้การเปลี่ยนโฮสต์ใน
แอตทริบิวต์ tools นั่นคือ กำหนดค่าเครื่องมือในการ
กำหนดค่าโฮสต์
คุณจะเห็นผลกระทบที่หลงเหลือจากการเปลี่ยนนั้นด้านล่าง
$ cat > foo/BUILD <<<EOF
genrule(
name = "my_gen",
srcs = ["x.in"],
outs = ["x.cc"],
cmd = "$(locations :tool) $< >$@",
tools = [":tool"],
)
cc_library(
name = "tool",
)
EOF
$ bazel cquery "//foo:tool"
tool(target_config)
$ bazel cquery "deps(//foo:my_gen)"
my_gen (target_config)
tool (host_config)
...
$ bazel cquery "//foo:tool"
tool(host_config)
วิธีแก้ปัญหา: เปลี่ยนตัวเลือกการเริ่มต้นเพื่อบังคับให้มีการวิเคราะห์เป้าหมายที่กำหนดค่าไว้ใหม่
ตัวอย่างเช่น เพิ่ม --test_arg=<whatever> ลงในคำสั่งบิลด์ของคุณ
การแก้ปัญหา
รูปแบบเป้าหมายแบบเรียกซ้ำ (/...)
หากคุณพบข้อความต่อไปนี้
$ bazel cquery --universe_scope=//foo:app "somepath(//foo:app, //foo/...)" ERROR: Error doing post analysis query: Evaluation failed: Unable to load package '[foo]' because package is not in scope. Check that all target patterns in query expression are within the --universe_scope of this query.
ข้อความนี้จะแนะนำอย่างไม่ถูกต้องว่าแพ็กเกจ //foo ไม่อยู่ในขอบเขต แม้ว่า
--universe_scope=//foo:app จะรวมแพ็กเกจนี้ไว้ก็ตาม ซึ่งเป็นข้อจำกัดด้านการออกแบบใน cquery วิธีแก้ปัญหาคือรวม //foo/... ไว้ในขอบเขตจักรวาลอย่างชัดแจ้ง
$ bazel cquery --universe_scope=//foo:app,//foo/... "somepath(//foo:app, //foo/...)"
หากวิธีดังกล่าวไม่ได้ผล (เช่น เนื่องจากเป้าหมายบางรายการใน //foo/... สร้างไม่ได้ด้วยแฟล็กการสร้างที่เลือก) ให้คลี่รูปแบบออกเป็นแพ็กเกจที่เป็นส่วนประกอบด้วยตนเองโดยใช้การค้นหาการประมวลผลล่วงหน้า
# Replace "//foo/..." with a subshell query call (not cquery!) outputting each package, piped into # a sed call converting "<pkg>" to "//<pkg>:*", piped into a "+"-delimited line merge. # Output looks like "//foo:*+//foo/bar:*+//foo/baz". # $ bazel cquery --universe_scope=//foo:app "somepath(//foo:app, $(bazel query //foo/... --output=package | sed -e 's/^/\/\//' -e 's/$/:*/' | paste -sd "+" -))"