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.4.0/reference/be/general#test_suite)
เนื่องจากไม่ใช่เป้าหมายที่กำหนดค่าไว้ สำหรับการตั้งค่า โปรดดู [aquery](/versions/6.4.0/docs/aquery)
ไวยากรณ์พื้นฐาน
การโทร cquery
แบบง่ายๆ จะมีลักษณะดังนี้
bazel cquery "function(//target)"
นิพจน์การค้นหา "function(//target)"
ประกอบด้วยข้อมูลต่อไปนี้
function(...)
คือฟังก์ชันที่จะเรียกใช้ในเป้าหมายcquery
สนับสนุนส่วนใหญ่ ของฟังก์ชันของquery
รวมทั้ง ใหม่ๆ สัก 2-3 รายการ//target
คือนิพจน์ที่ถูกป้อนไปยังฟังก์ชัน ในตัวอย่างนี้ คือเป้าหมายพื้นฐาน แต่ภาษาของคำค้นหาก็อนุญาตให้ซ้อนฟังก์ชันต่างๆ ได้เช่นกัน ดูตัวอย่างในวิธีการของคำค้นหา
cquery
ต้องมีเป้าหมายเพื่อเรียกใช้ผ่านการโหลดและการวิเคราะห์
เฟส cquery
จะแยกวิเคราะห์เป้าหมายที่ระบุในฟิลด์ ยกเว้นกรณีที่ระบุไว้เป็นอย่างอื่น
นิพจน์คำค้นหา โปรดดู --universe_scope
สำหรับการค้นหาทรัพยากร Dependency ของเป้าหมายบิลด์ระดับบนสุด
การกำหนดค่า
เส้น:
//tree:ash (9f87702)
หมายความว่า //tree:ash
สร้างขึ้นในการกำหนดค่าที่มีรหัส 9f87702
สำหรับ
นี่คือแฮชที่คลุมเครือของค่าตัวเลือกบิลด์ที่กำหนดพารามิเตอร์
การกำหนดค่า
หากต้องการดูเนื้อหาทั้งหมดของการกำหนดค่า ให้เรียกใช้คำสั่งต่อไปนี้
$ bazel config 9f87702
การกำหนดค่าโฮสต์ใช้รหัสพิเศษ (HOST)
ไฟล์ต้นฉบับที่ไม่ได้สร้างขึ้น เช่น
รหัสที่มักพบใน srcs
ให้ใช้รหัสพิเศษ (null)
(เนื่องจาก
ไม่จำเป็นต้องมีการกำหนดค่า)
9f87702
คือคำนำหน้าของบัตรประจำตัวที่สมบูรณ์ เนื่องจากรหัสที่สมบูรณ์
แฮช SHA-256 ที่ยาวและติดตามยาก cquery
เข้าใจ
คำนำหน้ารหัสที่สมบูรณ์ คล้ายกับ
ใช้แฮชแบบสั้น
หากต้องการดูรหัสที่สมบูรณ์ ให้เรียกใช้ $ 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
เอกสารประกอบเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบเป้าหมาย
ฟังก์ชัน
ของชุดฟังก์ชัน
สนับสนุนโดย query
, cquery
สนับสนุนทั้งหมดยกเว้น
allrdeps
,
buildfiles
rbuildfiles
,
siblings
tests
และ
visible
cquery
ยังมีฟังก์ชันใหม่ดังต่อไปนี้
การกำหนดค่า
expr ::= config(expr, word)
โอเปอเรเตอร์ config
พยายามค้นหาเป้าหมายที่กำหนดค่าไว้สำหรับ
ป้ายกำกับที่แสดงโดยอาร์กิวเมนต์และการกำหนดค่าแรกที่ระบุโดย
อาร์กิวเมนต์ที่สอง
ค่าที่ถูกต้องสำหรับอาร์กิวเมนต์ที่ 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 ปกติ จึงรับค่าชุดของ
ตัวเลือกที่ใช้ได้ระหว่างบิลด์
การใช้ตัวเลือกข้อความค้นหา
--universe_scope
(รายการที่คั่นด้วยจุลภาค)
ทรัพยากร Dependency ของเป้าหมายที่กำหนดค่าไว้มักจะดำเนินการ การเปลี่ยน ซึ่งทำให้การกำหนดค่าแตกต่างจากการกำหนดค่า แฟล็กนี้ ช่วยให้คุณค้นหาเป้าหมายได้ราวกับว่าเป้าหมายนั้นสร้างขึ้นเป็นทรัพยากร Dependency หรือเป้าหมายแบบทรานซิทีฟ การอ้างอิงของเป้าหมายอื่น เช่น
# x/BUILD genrule( name = "my_gen", srcs = ["x.in"], outs = ["x.cc"], cmd = "$(locations :tool) $< >$@", tools = [":tool"], ) cc_library( name = "tool", )
Genrules จะกำหนดค่าเครื่องมือใน การกำหนดค่าโฮสต์ ดังนั้นการค้นหาต่อไปนี้จะได้เอาต์พุตต่อไปนี้
การค้นหา | สร้างเป้าหมาย | เอาต์พุต |
---|---|---|
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
(บูลีน, default=True)
การตั้งค่าแฟล็กนี้เป็น "เท็จ" จะกรองผลการค้นหาทั้งหมดที่ไม่ได้ตั้งค่าอย่างชัดแจ้งใน ไฟล์ BUILD และตั้งค่าไว้ที่อื่นโดย Bazel ซึ่งรวมถึงการกรองที่แก้ปัญหาแล้ว Toolchain
--tool_deps
(บูลีน, default=True)
การตั้งค่าแฟล็กนี้เป็น "เท็จ" จะกรองเป้าหมายที่กำหนดค่าไว้ทั้งหมดซึ่งพารามิเตอร์
เส้นทางจากเป้าหมายที่ค้นหาไปยังรายการดังกล่าวข้ามการเปลี่ยนผ่านระหว่างเป้าหมาย
และการกำหนดค่า
การกำหนดค่าที่ไม่ใช่เป้าหมาย
หากเป้าหมายที่ค้นหาอยู่ในการกำหนดค่าเป้าหมาย การตั้งค่า --notool_deps
จะ
ส่งคืนเฉพาะเป้าหมายที่อยู่ในการกำหนดค่าเป้าหมายด้วย หากคำค้นหาคือ
เป้าหมายอยู่ในการกำหนดค่าที่ไม่ใช่เป้าหมาย การตั้งค่า --notool_deps
จะแสดงผลเท่านั้น
ในการกำหนดค่าที่ไม่ใช่เป้าหมายด้วย โดยทั่วไปการตั้งค่านี้จะไม่ส่งผลต่อการกรอง
จากเครื่องมือที่มีการแก้ไขปัญหาแล้ว
--include_aspects
(บูลีน, default=True)
เพิ่ม Aspects ได้
ทรัพยากร Dependency เพิ่มเติมไปยังบิลด์ โดยค่าเริ่มต้น cquery
จะไม่ติดตามแง่มุมต่างๆ เนื่องจาก
ทำให้กราฟที่สืบค้นได้มีขนาดใหญ่ขึ้น ซึ่งใช้หน่วยความจำมากกว่า แต่การติดตามดูจะเกิดประโยชน์มากขึ้น
ผลลัพธ์ที่แม่นยำ
หากคุณไม่ต้องกังวลเกี่ยวกับผลกระทบของหน่วยความจำจากการค้นหาขนาดใหญ่ ให้เปิดใช้งานธงนี้โดยค่าเริ่มต้นใน bazelrc ของคุณนั่นเอง
หากคุณค้นหาโดยมีการปิดใช้ด้านต่างๆ คุณอาจพบปัญหาว่าเป้าหมาย X ล้มเหลวขณะที่
เป้าหมายอาคาร Y แต่ cquery somepath(Y, X)
และ cquery deps(Y) | grep 'X'
ไม่แสดงผลลัพธ์เนื่องจากการขึ้นต่อกันเกิดขึ้นผ่านด้านหนึ่ง
รูปแบบเอาต์พุต
โดยค่าเริ่มต้น เอาต์พุต cquery จะแสดงรายการที่เรียงลำดับตามการขึ้นต่อกันของคู่ป้ายกำกับและการกำหนดค่า ยังมีตัวเลือกอื่นๆ ในการแสดงผลลัพธ์ด้วย
ทรานซิชัน
--transitions=lite --transitions=full
การเปลี่ยนการกำหนดค่า ใช้เพื่อสร้างเป้าหมายภายใต้เป้าหมายระดับบนสุดใน มากกว่าเป้าหมายระดับบนสุด
ตัวอย่างเช่น เป้าหมายอาจกำหนดการเปลี่ยนไปใช้การกำหนดค่าโฮสต์
ทรัพยากร Dependency ในแอตทริบิวต์ tools
หรือที่เรียกว่าแอตทริบิวต์
การเปลี่ยนแปลง กฎยังสามารถกำหนดการเปลี่ยนผ่าน
การกำหนดค่าของตัวเอง
ซึ่งเรียกกันว่าการเปลี่ยนคลาสกฎ รูปแบบเอาต์พุตนี้จะแสดงข้อมูลเกี่ยวกับ
การเปลี่ยนแปลงเหล่านี้ เช่น ประเภท และผลที่มีต่อการสร้าง
ตัวเลือก
รูปแบบเอาต์พุตนี้จะทริกเกอร์โดย Flag --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 จะแสดงข้อมูลการกำหนดค่าเป็นส่วนหนึ่งของแต่ละรายการ เป้าหมายที่กำหนดค่าไว้ หากคุณต้องการยกเว้นข้อมูลนี้และรับผลลัพธ์ Proto ที่มีการจัดรูปแบบเหมือนกับเอาต์พุต Proto ของคำค้นหาทุกประการ ให้ตั้งค่าแฟล็กนี้เป็น "เท็จ"
ดูเอกสารเอาต์พุต Proto ของคำค้นหา เพื่อดูตัวเลือกเพิ่มเติมเกี่ยวกับเอาต์พุต Pro
ผลลัพธ์ที่เป็นกราฟ
--output=graph
ตัวเลือกนี้จะสร้างเอาต์พุตเป็นไฟล์ .dot ที่สามารถใช้ร่วมกับ Graphviz ได้ ดู query
เอกสารประกอบเอาต์พุตกราฟเพื่อดูรายละเอียด cquery
ยังรองรับ --graph:node_limit
และ
--graph:factored
เอาต์พุตไฟล์
--output=files
ตัวเลือกนี้จะพิมพ์รายการไฟล์เอาต์พุตที่สร้างโดยแต่ละเป้าหมายที่ตรงกัน
ตามคำค้นหาที่คล้ายกับรายการที่พิมพ์ไว้ท้าย bazel build
คำขอ ผลลัพธ์จะมีเฉพาะไฟล์ที่โฆษณาใน
กลุ่มเอาต์พุตตามที่กำหนดโดย
แฟล็ก --output_groups
ซึ่งรวมถึงไฟล์ต้นฉบับ
การกำหนดรูปแบบเอาต์พุตโดยใช้ Starlark
--output=starlark
รูปแบบเอาต์พุตนี้เรียกฟังก์ชัน Starlark
สำหรับแต่ละเป้าหมายที่กำหนดค่าไว้ในผลการค้นหา และพิมพ์ค่า
แสดงผลจากการโทร แฟล็ก --starlark:file
ระบุตำแหน่งของ
ไฟล์ Starlark ที่กำหนดฟังก์ชันชื่อ format
ด้วยพารามิเตอร์เดียว
target
ฟังก์ชันนี้จะถูกเรียกสำหรับแต่ละ เป้าหมาย
ในผลการค้นหา หรือเพื่อความสะดวก คุณสามารถระบุเพียง
เนื้อหาของฟังก์ชันที่ประกาศเป็น def format(target): return expr
โดยใช้เมธอด
การแจ้งว่าไม่เหมาะสม --starlark:expr
"cquery" ภาษาถิ่นสตาร์ลาร์ก
สภาพแวดล้อมของ cquery Starlark จะแตกต่างจากไฟล์ BUILD หรือ .bzl ซึ่งรวมถึง
All Core Starlark
ค่าคงที่และฟังก์ชันในตัว
บวกด้วยคำค้นหาเฉพาะ 2-3 รายการที่อธิบายไว้ด้านล่าง แต่ไม่ใช่ (ตัวอย่างเช่น) glob
native
หรือ rule
และไม่รองรับคำสั่งการโหลด
build_options(target)
build_options(target)
จะแสดงผลแผนที่ที่มีคีย์เป็นตัวระบุตัวเลือกบิลด์ (ดู
การกำหนดค่า)
และมีค่าของค่า Starlark ตัวเลือกบิลด์ที่มีค่าไม่ใช่กฎหมาย Starlark
จะไม่แสดงในแผนที่นี้
หากเป้าหมายเป็นไฟล์อินพุต build_options(target)
จะแสดงผล "ไม่มี" เป็นไฟล์อินพุต
เป้าหมายมีการกำหนดค่าเป็น Null
ผู้ให้บริการ(เป้าหมาย)
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']"
พิมพ์ป้ายกำกับของแต่ละเป้าหมายด้วยเอาต์พุตเพียง 1 รายการ ตัวอย่างนี้ใช้ ฟังก์ชัน 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 เทียบกับข้อความค้นหา
cquery
และ query
ส่งเสริมกันและกันและยอดเยี่ยม
กลุ่มเฉพาะที่แตกต่างกัน ลองตัดสินใจเลือกเครื่องมือต่อไปนี้ที่เหมาะกับคุณ
cquery
ตามสาขาที่เฉพาะเจาะจงของselect()
ไปยัง สร้างแบบจำลองกราฟที่คุณสร้างขึ้นquery
ไม่รู้ว่าอันไหน Branch ที่บิลด์เลือก ดังนั้นมีค่าประมาณสูงเกินไปโดยรวม Branch ทั้งหมด- ความแม่นยำของ
cquery
ต้องการการสร้างกราฟมากกว่าquery
มี โดยเฉพาะอย่างยิ่งcquery
ประเมินเป้าหมายที่กำหนดค่าในขณะที่query
เท่านั้น ประเมิน เป้าหมาย ซึ่งจะใช้เวลานานกว่าและใช้หน่วยความจำมากขึ้น - การตีความของ
cquery
เกี่ยวกับ ภาษาในคำค้นหาทำให้เกิดความกำกวม ที่query
หลีกเลี่ยง ตัวอย่างเช่น หากมี"//foo"
อยู่ใน 2 การกำหนดค่าcquery "deps(//foo)"
ควรใช้ไหม ฟังก์ชัน[config](#config)
ช่วยคุณได้ cquery
ไม่มีการรองรับการใช้งานบางอย่างเนื่องจากเป็นเครื่องมือที่ใหม่กว่า กรณี โปรดดูรายละเอียดในปัญหาที่ทราบ
ปัญหาที่ทราบ
เป้าหมายทั้งหมดที่ cquery
"สร้าง" ต้องมีการกําหนดค่าเดียวกัน
ก่อนที่จะประเมินคำค้นหา cquery
จะทริกเกอร์บิลด์เพียง
ก่อนจุดที่การดำเนินการของบิลด์จะทำงาน กำหนดกลุ่มเป้าหมาย
"การสร้าง" จะถูกเลือกจากป้ายกำกับทั้งหมดที่ปรากฏในการค้นหาโดยค่าเริ่มต้น
นิพจน์ (คุณสามารถลบล้างได้
ด้วย --universe_scope
) เหล่านี้
ต้องมีการกำหนดค่าเดียวกัน
แม้ว่าโดยทั่วไปแล้วแคมเปญเหล่านี้จะแชร์ "เป้าหมาย" ระดับบนสุด การกำหนดค่า
สามารถเปลี่ยนการกำหนดค่าของตนเองด้วย
การเปลี่ยนผ่าน Edge เข้ามาใหม่
นี่คือส่วนที่ 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 "+" -))"