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

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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 เนื่องจากไม่ได้กำหนดค่าเป็นเป้าหมาย สำหรับกรณีแรก โปรดดู aquery

ไวยากรณ์พื้นฐาน

การเรียกใช้ cquery อย่างง่ายจะมีลักษณะดังนี้

bazel cquery "function(//target)"

นิพจน์การค้นหา "function(//target)" ประกอบด้วยข้อมูลต่อไปนี้

  • function(...) คือฟังก์ชันที่จะเรียกใช้ในเป้าหมาย cquery รองรับฟังก์ชันส่วนใหญ่ ของ query รวมถึงฟังก์ชันใหม่ๆ อีก 2-3 รายการ
  • //target คือนิพจน์ที่ป้อนให้กับฟังก์ชัน ในตัวอย่างนี้ นิพจน์เป็นเป้าหมายอย่างง่าย แต่ภาษาที่ใช้ในคำค้นหายังอนุญาตให้ซ้อนฟังก์ชันได้ด้วย ดูตัวอย่างได้ที่คำแนะนำในการค้นหา

cquery ต้องมีเป้าหมายเพื่อเรียกใช้ผ่านระยะการโหลดและการวิเคราะห์ เว้นแต่จะระบุไว้เป็นอย่างอื่น cquery จะแยกวิเคราะห์เป้าหมายที่ระบุไว้ใน นิพจน์การค้นหา ดู--universe_scope สำหรับการค้นหาการอ้างอิงของเป้าหมายการสร้างระดับบนสุด

การกำหนดค่า

บรรทัด

//tree:ash (9f87702)

หมายความว่าสร้าง //tree:ash ในการกำหนดค่าที่มีรหัส 9f87702 สำหรับเป้าหมายส่วนใหญ่ นี่คือแฮชแบบทึบของค่าตัวเลือกการสร้างที่กำหนด การกำหนดค่า

หากต้องการดูเนื้อหาทั้งหมดของการกำหนดค่า ให้เรียกใช้คำสั่งต่อไปนี้

$ bazel config 9f87702

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 an exec-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 (exec)

หากต้องการประกาศอินสแตนซ์ที่จะค้นหาอย่างแม่นยำ ให้ใช้ฟังก์ชัน config

ดูข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบเป้าหมายได้ที่queryเอกสารประกอบเกี่ยวกับรูปแบบเป้าหมาย

ฟังก์ชัน

ในชุดฟังก์ชัน ที่ query รองรับ cquery รองรับทุกฟังก์ชันยกเว้น allrdeps buildfiles rbuildfiles siblings tests และ visible

cquery ยังมีฟังก์ชันใหม่ต่อไปนี้ด้วย

การกำหนดค่า

expr ::= config(expr, word)

ตัวดำเนินการ config พยายามค้นหาเป้าหมายที่กำหนดค่าไว้สำหรับ ป้ายกำกับที่ระบุโดยอาร์กิวเมนต์แรกและการกำหนดค่าที่ระบุโดย อาร์กิวเมนต์ที่สอง

ค่าที่ใช้ได้สำหรับอาร์กิวเมนต์ที่ 2 คือ null หรือแฮชการกำหนดค่าที่กำหนดเอง คุณสามารถดึงข้อมูลแฮชจาก $ bazel config หรือเอาต์พุตของ cquery ก่อนหน้า

ตัวอย่าง

$ bazel cquery "config(//bar, 3732cc8)" --universe_scope=//foo
$ bazel cquery "deps(//foo)"
//bar (exec)
//baz (exec)

$ bazel cquery "config(//baz, 3732cc8)"

หากไม่พบผลลัพธ์ทั้งหมดของอาร์กิวเมนต์แรกในการกำหนดค่าที่ระบุ ระบบจะแสดงเฉพาะผลลัพธ์ที่พบ หากไม่พบผลลัพธ์ในการกำหนดค่าที่ระบุ ระบบจะค้นหาไม่สำเร็จ

ตัวเลือก

ตัวเลือกการสร้าง

cquery ทำงานผ่านการสร้าง Bazel ปกติ จึงรับช่วงชุดตัวเลือกที่มีให้ใช้งานในระหว่างการสร้าง

การใช้ตัวเลือก cquery

--universe_scope (รายการที่คั่นด้วยคอมมา)

โดยปกติแล้ว การขึ้นต่อกันของเป้าหมายที่กำหนดค่าจะผ่านการเปลี่ยนสถานะ ซึ่งทำให้การกำหนดค่าแตกต่างจากเป้าหมายที่ขึ้นต่อกัน แฟล็กนี้ ช่วยให้คุณค้นหาเป้าหมายได้ราวกับว่าสร้างขึ้นเป็นทรัพยากร Dependency หรือทรัพยากร Dependency แบบทรานซิทีฟ ของเป้าหมายอื่น เช่น

# x/BUILD
genrule(
     name = "my_gen",
     srcs = ["x.in"],
     outs = ["x.cc"],
     cmd = "$(locations :tool) $< >$@",
     tools = [":tool"],
)
cc_binary(
    name = "tool",
    srcs = ["tool.cpp"],
)

Genrules กำหนดค่าเครื่องมือใน exec configuration เพื่อให้การค้นหาต่อไปนี้สร้างเอาต์พุตต่อไปนี้

การค้นหา สร้างเป้าหมายแล้ว เอาต์พุต
bazel cquery "//x:tool" //x:tool //x:tool(targetconfig)
bazel cquery "//x:tool" --universe_scope="//x:my_gen" //x:my_gen //x:tool(execconfig)

หากตั้งค่าสถานะนี้ ระบบจะสร้างเนื้อหาของสถานะ หากไม่ได้ตั้งค่าไว้ ระบบจะสร้างเป้าหมายทั้งหมด ที่กล่าวถึงในนิพจน์การค้นหาแทน ระบบจะใช้การปิดทรานซิทีฟของ เป้าหมายที่สร้างขึ้นเป็นขอบเขตของการค้นหา ไม่ว่าจะด้วยวิธีใด เป้าหมาย ที่จะสร้างต้องสร้างได้ที่ระดับบนสุด (กล่าวคือ เข้ากันได้กับ ตัวเลือกระดับบนสุด) cquery จะแสดงผลลัพธ์ใน Closure แบบทรานซิทีฟของเป้าหมายระดับบนสุดเหล่านี้

แม้ว่าจะสร้างเป้าหมายทั้งหมดในนิพจน์การค้นหาที่ระดับบนสุดได้ แต่การไม่ทำเช่นนั้นอาจเป็นประโยชน์ ตัวอย่างเช่น การตั้งค่า --universe_scope อย่างชัดเจนอาจช่วยป้องกันไม่ให้สร้างเป้าหมายหลายครั้งในการกำหนดค่าที่คุณไม่สนใจ นอกจากนี้ยังช่วยระบุเวอร์ชันการกำหนดค่าของเป้าหมายที่คุณกำลังมองหาได้อีกด้วย คุณควรตั้งค่าสถานะนี้ หากนิพจน์การค้นหาซับซ้อนกว่า deps(//foo)

--implicit_deps (บูลีน ค่าเริ่มต้น=True)

การตั้งค่าแฟล็กนี้เป็น false จะกรองผลลัพธ์ทั้งหมดที่ไม่ได้ตั้งค่าอย่างชัดเจนใน ไฟล์ BUILD และ Bazel จะตั้งค่าไว้ที่อื่นแทน ซึ่งรวมถึงการกรอง เครื่องมือที่แก้ไขแล้ว

--tool_deps (บูลีน ค่าเริ่มต้น=True)

การตั้งค่าสถานะนี้เป็น "เท็จ" จะกรองเป้าหมายที่กำหนดค่าทั้งหมดซึ่ง เส้นทางจากเป้าหมายที่ค้นหาไปยังเป้าหมายเหล่านั้นข้ามการเปลี่ยนผ่านระหว่างการกำหนดค่าเป้าหมายกับ การกำหนดค่าที่ไม่ใช่เป้าหมาย หากเป้าหมายที่ค้นหาอยู่ในกำหนดค่าเป้าหมาย การตั้งค่า --notool_deps จะแสดงเฉพาะเป้าหมายที่อยู่ในกำหนดค่าเป้าหมายด้วย หากเป้าหมายที่ค้นหาอยู่ในการกําหนดค่าที่ไม่ใช่เป้าหมาย การตั้งค่า --notool_deps จะแสดงเฉพาะเป้าหมายที่อยู่ในการกําหนดค่าที่ไม่ใช่เป้าหมายด้วย โดยทั่วไปการตั้งค่านี้จะไม่มีผลต่อการกรอง ของ Toolchain ที่แก้ไขแล้ว

--include_aspects (บูลีน ค่าเริ่มต้น=True)

รวมการพึ่งพาที่เพิ่มโดย aspects

หากปิดใช้ฟีเจอร์นี้ cquery somepath(X, Y) และ cquery deps(X) | grep 'Y' จะละเว้น Y หาก X ขึ้นอยู่กับ Y ผ่านแง่มุมเท่านั้น

รูปแบบเอาต์พุต

โดยค่าเริ่มต้น cquery จะแสดงผลลัพธ์ในรายการป้ายกำกับและการกำหนดค่าที่จัดเรียงตามการอ้างอิง นอกจากนี้ ยังมีตัวเลือกอื่นๆ ในการแสดงผลลัพธ์ด้วย

ทรานซิชัน

--transitions=lite
--transitions=full

การเปลี่ยนการกำหนดค่า ใช้เพื่อสร้างเป้าหมายภายใต้เป้าหมายระดับบนสุดในการกำหนดค่าที่แตกต่างกัน จากเป้าหมายระดับบนสุด

เช่น เป้าหมายอาจบังคับให้เปลี่ยนไปใช้การกำหนดค่า exec ในการขึ้นต่อกันทั้งหมดในแอตทริบิวต์ tools ซึ่งเรียกว่าการเปลี่ยนแอตทริบิวต์ นอกจากนี้ กฎยังกำหนดการเปลี่ยนสถานะในการกำหนดค่าของตัวเองได้ด้วย ซึ่งเรียกว่าการเปลี่ยนสถานะของคลาสกฎ รูปแบบเอาต์พุตนี้จะแสดงข้อมูลเกี่ยวกับการเปลี่ยนผ่านเหล่านี้ เช่น ประเภทของการเปลี่ยนผ่านและผลกระทบที่มีต่อตัวเลือกการสร้าง

รูปแบบเอาต์พุตนี้จะทริกเกอร์โดยแฟล็ก --transitions ซึ่งตั้งค่าเป็น NONE โดยค่าเริ่มต้น โดยตั้งค่าเป็นโหมด FULL หรือ LITE ได้ โหมด FULL จะแสดงข้อมูลเกี่ยวกับการเปลี่ยนคลาสของกฎและการเปลี่ยนแอตทริบิวต์ รวมถึงส่วนต่างโดยละเอียดของตัวเลือกก่อนและหลังการเปลี่ยน LITE mode จะแสดงข้อมูลเดียวกันโดยไม่มีส่วนต่างของตัวเลือก

เอาต์พุตข้อความโปรโตคอล

--output=proto

ตัวเลือกนี้จะทำให้มีการพิมพ์เป้าหมายที่ได้ในรูปแบบบัฟเฟอร์โปรโตคอลไบนารี ดูคำจำกัดความของบัฟเฟอร์โปรโตคอลได้ที่ src/main/protobuf/analysis_v2.proto

CqueryResult คือข้อความระดับบนสุดที่มีผลลัพธ์ของ cquery โดยมีรายการConfiguredTargetข้อความและรายการConfiguration ข้อความ ConfiguredTarget แต่ละรายการมี configuration_id ซึ่งมีค่าเท่ากับค่าของฟิลด์ id จากข้อความ Configuration ที่เกี่ยวข้อง

--[no]proto:include_configurations

โดยค่าเริ่มต้น ผลลัพธ์ของ cquery จะแสดงข้อมูลการกำหนดค่าเป็นส่วนหนึ่งของเป้าหมายที่กำหนดค่าแต่ละรายการ หากต้องการละเว้นข้อมูลนี้และรับเอาต์พุต Proto ที่มีการจัดรูปแบบเหมือนกับเอาต์พุต Proto ของการค้นหาทุกประการ ให้ตั้งค่าสถานะนี้เป็น false

ดูตัวเลือกเพิ่มเติมที่เกี่ยวข้องกับเอาต์พุต Proto ได้ในเอกสารประกอบเกี่ยวกับเอาต์พุต Proto ของการค้นหา

เอาต์พุตกราฟ

--output=graph

ตัวเลือกนี้จะสร้างเอาต์พุตเป็นไฟล์ .dot ที่เข้ากันได้กับ Graphviz ดูรายละเอียดได้ที่queryเอกสารประกอบเกี่ยวกับเอาต์พุตกราฟ cquery ยังรองรับ --graph:node_limit และ --graph:factored ด้วย

เอาต์พุตไฟล์

--output=files

ตัวเลือกนี้จะพิมพ์รายการไฟล์เอาต์พุตที่สร้างขึ้นโดยแต่ละเป้าหมายที่ตรงกัน ตามคำค้นหาที่คล้ายกับรายการที่พิมพ์เมื่อสิ้นสุดการเรียกใช้ bazel build เอาต์พุตจะมีเฉพาะไฟล์ที่โฆษณาในกลุ่มเอาต์พุตที่ขอตามที่กำหนดโดยแฟล็ก --output_groups แต่จะรวมไฟล์ต้นฉบับ

เส้นทางทั้งหมดที่รูปแบบเอาต์พุตนี้ปล่อยออกมาจะสัมพันธ์กับ execroot ซึ่งรับได้ ผ่าน bazel info execution_root หากมี bazel-out Convenience Symlink เส้นทางไปยังไฟล์ในที่เก็บหลักจะได้รับการแก้ไขโดยอิงตามไดเรกทอรีพื้นที่ทำงานด้วย

การกำหนดรูปแบบเอาต์พุตโดยใช้ Starlark

--output=starlark

รูปแบบเอาต์พุตนี้จะเรียกใช้ฟังก์ชัน Starlark สำหรับแต่ละเป้าหมายที่กำหนดค่าไว้ในผลการค้นหา และพิมพ์ค่า ที่เรียกใช้ แฟล็ก --starlark:file ระบุตำแหน่งของไฟล์ Starlark ที่กำหนดฟังก์ชันชื่อ format ที่มีพารามิเตอร์เดียว target ฟังก์ชันนี้จะเรียกใช้สำหรับ Target แต่ละรายการ ในผลการค้นหา หรือคุณจะระบุเฉพาะเนื้อหาของฟังก์ชันที่ประกาศเป็น def format(target): return expr โดยใช้แฟล็ก --starlark:expr เพื่อความสะดวกก็ได้

ภาษา Starlark ของ "cquery"

สภาพแวดล้อม Starlark ของ cquery แตกต่างจากไฟล์ BUILD หรือ .bzl ซึ่งรวมถึง ค่าคงที่และฟังก์ชันในตัวทั้งหมดของ Starlark หลัก ค่าคงที่และฟังก์ชันในตัวทั้งหมดของ Starlark หลัก รวมถึงฟังก์ชันเฉพาะ cquery บางรายการที่อธิบายไว้ด้านล่าง แต่ไม่รวม (เช่น) glob native หรือ rule และไม่รองรับคำสั่ง load

build_options(target)

build_options(target) จะแสดงผลแมปที่มีคีย์เป็นตัวระบุตัวเลือกการสร้าง (ดูการกำหนดค่า) และมีค่าเป็นค่า Starlark ระบบจะละเว้นตัวเลือกบิลด์ที่มีค่าไม่ใช่ค่า Starlark ที่ถูกต้องออกจากแผนที่นี้

หากเป้าหมายเป็นไฟล์อินพุต build_options(target) จะแสดงผลเป็น None เนื่องจากเป้าหมายไฟล์อินพุต มีการกำหนดค่าเป็น Null

ผู้ให้บริการ(เป้าหมาย)

providers(target) จะแสดงผลแมปที่มีคีย์เป็นชื่อของ ผู้ให้บริการ (เช่น "DefaultInfo") และมีค่าเป็นค่า Starlark ของผู้ให้บริการ ระบบจะละเว้นผู้ให้บริการที่มีค่าไม่ใช่ค่า Starlark ที่ถูกต้องตามกฎหมายออกจากแผนที่นี้

ตัวอย่าง

พิมพ์รายการชื่อฐานของไฟล์ทั้งหมดที่สร้างโดย //foo โดยคั่นด้วยช่องว่าง

  bazel cquery //foo --output=starlark \
    --starlark:expr="' '.join([f.basename for f in providers(target)['DefaultInfo'].files.to_list()])"

พิมพ์รายการเส้นทางของไฟล์ทั้งหมดที่สร้างโดยเป้าหมาย rule ใน //bar และแพ็กเกจย่อย โดยคั่นด้วยช่องว่าง

  bazel cquery 'kind(rule, //bar/...)' --output=starlark \
    --starlark:expr="' '.join([f.path for f in providers(target)['DefaultInfo'].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(providers(target)["DefaultInfo"].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 จะติดตามกิ่งก้านselect()ที่เฉพาะเจาะจงเพื่อ สร้างโมเดลกราฟที่คุณสร้างขึ้น query ไม่ทราบว่าบิลด์เลือกสาขาใด จึงประมาณค่าสูงเกินจริงโดยรวมทุกสาขา
  • ความแม่นยำของ cquery ต้องสร้างกราฟมากกว่า query กล่าวโดยเจาะจงคือ cquery จะประเมินเป้าหมายที่กำหนดค่า ขณะที่ query จะประเมินเป้าหมายเท่านั้น ซึ่งจะใช้เวลานานขึ้นและใช้หน่วยความจำมากขึ้น
  • cqueryการตีความภาษาการค้นหาของ จะทำให้เกิดความกำกวม ซึ่งqueryหลีกเลี่ยง เช่น หาก "//foo" มีอยู่ในการกำหนดค่า 2 รายการ cquery "deps(//foo)" ควรใช้รายการใด ฟังก์ชัน config จะช่วยในเรื่องนี้ได้

เอาต์พุตที่ไม่แน่นอน

cquery จะไม่ล้างกราฟบิลด์จากคำสั่งก่อนหน้าโดยอัตโนมัติ จึงมีแนวโน้มที่จะเลือกผลการค้นหาจากคำค้นหาที่ผ่านมา

เช่น genrule จะใช้การเปลี่ยน exec ในแอตทริบิวต์ tools ซึ่งหมายความว่ากำหนดค่าเครื่องมือในการกำหนดค่า exec

คุณดูผลกระทบที่ยังคงอยู่ของการเปลี่ยนผ่านดังกล่าวได้ที่ด้านล่าง

$ cat > foo/BUILD <<

ซึ่งอาจเป็นลักษณะการทำงานที่ต้องการหรือไม่ก็ได้ ขึ้นอยู่กับสิ่งที่คุณพยายามประเมิน

หากต้องการปิดใช้ ให้เรียกใช้ blaze clean ก่อน cquery เพื่อให้ได้กราฟการวิเคราะห์ ล่าสุด

การแก้ปัญหา

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

หากพบปัญหาต่อไปนี้

$ 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/... ในขอบเขตของ Universe อย่างชัดเจน

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