การค้นหาที่กำหนดค่าได้ (cquery)

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

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=&quot;//x:my_gen&quot; //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=&lt;whatever&gt; ลงในคำสั่งบิลด์

การแก้ปัญหา

รูปแบบเป้าหมายที่เกิดซ้ำ (/...)

หากคุณพบสิ่งต่อไปนี้

$ 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 "+" -))"