คู่มือเริ่มต้นการค้นหาฉบับย่อ

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

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

ดูรายละเอียดภาษาและ--output flag ได้ในคู่มือข้อมูลอ้างอิงการค้นหาของ Bazel และข้อมูลอ้างอิง cquery ของ Bazel รับความช่วยเหลือใน IDE โดยพิมพ์ bazel help query หรือ bazel help cquery ในบรรทัดคำสั่ง

วัตถุประสงค์

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

ข้อกำหนดเบื้องต้น

เริ่มต้นด้วยการติดตั้ง Bazel หากยังไม่ได้ติดตั้ง บทแนะนำนี้ใช้ Git สำหรับการควบคุมแหล่งที่มา ดังนั้นเพื่อผลลัพธ์ที่ดีที่สุด ให้ติดตั้ง Git ด้วย

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

รับโปรเจ็กต์ตัวอย่าง

จากนั้นเรียกข้อมูลแอปตัวอย่างจากที่เก็บตัวอย่างของ Bazel โดยเรียกใช้คำสั่งต่อไปนี้ในเครื่องมือบรรทัดคำสั่งที่คุณเลือก

git clone https://github.com/bazelbuild/examples.git

โปรเจ็กต์ตัวอย่างสำหรับบทแนะนำนี้อยู่ในไดเรกทอรี examples/query-quickstart

เริ่มต้นใช้งาน

การค้นหา Bazel คืออะไร

การค้นหาช่วยให้คุณทราบเกี่ยวกับโค้ดเบสของ Bazel โดยการวิเคราะห์ความสัมพันธ์ระหว่างBUILDไฟล์และตรวจสอบเอาต์พุตที่ได้เพื่อหาข้อมูลที่เป็นประโยชน์ คู่มือนี้จะแสดงตัวอย่างฟังก์ชันการค้นหาพื้นฐานบางอย่าง แต่หากต้องการดูตัวเลือกเพิ่มเติม โปรดดูคู่มือการค้นหา การค้นหาช่วยให้คุณทราบเกี่ยวกับทรัพยากร Dependency ในโปรเจ็กต์ขนาดใหญ่โดยไม่ต้องไปยังส่วนต่างๆ ของBUILDไฟล์ด้วยตนเอง

หากต้องการเรียกใช้การค้นหา ให้เปิดเทอร์มินัลบรรทัดคำสั่งแล้วป้อนข้อมูลต่อไปนี้

bazel query 'query_function'

สถานการณ์

ลองนึกถึงสถานการณ์ที่เจาะลึกความสัมพันธ์ระหว่าง Cafe Bazel กับเชฟของร้าน คาเฟ่นี้ขายเฉพาะพิซซ่าและมักกะโรนีชีส ดูโครงสร้างของโปรเจ็กต์ด้านล่าง

bazelqueryguide
├── BUILD
├── src
│   └── main
│       └── java
│           └── com
│               └── example
│                   ├── customers
│                   │   ├── Jenny.java
│                   │   ├── Amir.java
│                   │   └── BUILD
│                   ├── dishes
│                   │   ├── Pizza.java
│                   │   ├── MacAndCheese.java
│                   │   └── BUILD
│                   ├── ingredients
│                   │   ├── Cheese.java
│                   │   ├── Tomatoes.java
│                   │   ├── Dough.java
│                   │   ├── Macaroni.java
│                   │   └── BUILD
│                   ├── restaurant
│                   │   ├── Cafe.java
│                   │   ├── Chef.java
│                   │   └── BUILD
│                   ├── reviews
│                   │   ├── Review.java
│                   │   └── BUILD
│                   └── Runner.java
└── MODULE.bazel

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

โปรเจ็กต์ประกอบด้วยแพ็กเกจต่างๆ ที่รวมกันเป็น Cafe โดยแบ่งออกเป็น restaurant, ingredients, dishes, customers และ reviews กฎภายในแพ็กเกจเหล่านี้จะกำหนดคอมโพเนนต์ต่างๆ ของ Cafe ด้วยแท็กและทรัพยากร Dependency ต่างๆ

การเรียกใช้บิลด์

โปรเจ็กต์นี้มีเมธอดหลักภายใน Runner.java ที่คุณสามารถเรียกใช้ เพื่อพิมพ์เมนูของคาเฟ่ออกมาได้ สร้างโปรเจ็กต์โดยใช้ Bazel ด้วยคำสั่ง bazel build และใช้ : เพื่อส่งสัญญาณว่าเป้าหมายชื่อ runner ดูชื่อเป้าหมายเพื่อดูวิธีอ้างอิงเป้าหมาย

หากต้องการสร้างโปรเจ็กต์นี้ ให้วางคำสั่งนี้ลงในเทอร์มินัล

bazel build :runner

เอาต์พุตควรมีลักษณะดังนี้หากการสร้างสำเร็จ

INFO: Analyzed target //:runner (49 packages loaded, 784 targets configured).
INFO: Found 1 target...
Target //:runner up-to-date:
  bazel-bin/runner.jar
  bazel-bin/runner
INFO: Elapsed time: 16.593s, Critical Path: 4.32s
INFO: 23 processes: 4 internal, 10 darwin-sandbox, 9 worker.
INFO: Build completed successfully, 23 total actions

หลังจากสร้างสำเร็จแล้ว ให้เรียกใช้แอปพลิเคชันโดยวางคำสั่งนี้

bazel-bin/runner
--------------------- MENU -------------------------

Pizza - Cheesy Delicious Goodness
Macaroni & Cheese - Kid-approved Dinner

----------------------------------------------------

ซึ่งจะแสดงรายการอาหารพร้อมคำอธิบายสั้นๆ

การสำรวจเป้าหมาย

โดยโปรเจ็กต์นี้จะแสดงรายการส่วนผสมและอาหารในแพ็กเกจของตัวเอง หากต้องการใช้การค้นหาเพื่อดูกฎของแพ็กเกจ ให้เรียกใช้คำสั่ง bazel query package/…

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

bazel query //src/main/java/com/example/dishes/...
bazel query //src/main/java/com/example/ingredients/...

หากคุณค้นหาเป้าหมายของแพ็กเกจส่วนผสม เอาต์พุตควรมีลักษณะดังนี้

//src/main/java/com/example/ingredients:cheese
//src/main/java/com/example/ingredients:dough
//src/main/java/com/example/ingredients:macaroni
//src/main/java/com/example/ingredients:tomato

การค้นหาทรัพยากร Dependency

นักวิ่งของคุณใช้เป้าหมายใดในการวิ่ง

สมมติว่าคุณต้องการเจาะลึกโครงสร้างของโปรเจ็กต์โดยไม่ต้องไปยุ่งกับระบบไฟล์ (ซึ่งอาจไม่สามารถทำได้สำหรับโปรเจ็กต์ขนาดใหญ่) Cafe Bazel ใช้กฎอะไร

หากเป้าหมายสำหรับโปรแกรมทดสอบเป็น runner ดังเช่นในตัวอย่างนี้ ให้ค้นหาการขึ้นต่อกันพื้นฐานของเป้าหมายโดยเรียกใช้คำสั่งต่อไปนี้

bazel query --noimplicit_deps "deps(target)"
bazel query --noimplicit_deps "deps(:runner)"
//:runner
//:src/main/java/com/example/Runner.java
//src/main/java/com/example/dishes:MacAndCheese.java
//src/main/java/com/example/dishes:Pizza.java
//src/main/java/com/example/dishes:macAndCheese
//src/main/java/com/example/dishes:pizza
//src/main/java/com/example/ingredients:Cheese.java
//src/main/java/com/example/ingredients:Dough.java
//src/main/java/com/example/ingredients:Macaroni.java
//src/main/java/com/example/ingredients:Tomato.java
//src/main/java/com/example/ingredients:cheese
//src/main/java/com/example/ingredients:dough
//src/main/java/com/example/ingredients:macaroni
//src/main/java/com/example/ingredients:tomato
//src/main/java/com/example/restaurant:Cafe.java
//src/main/java/com/example/restaurant:Chef.java
//src/main/java/com/example/restaurant:cafe
//src/main/java/com/example/restaurant:chef

ในกรณีส่วนใหญ่ ให้ใช้ฟังก์ชันการค้นหา deps() เพื่อดูการขึ้นต่อกันของเอาต์พุตแต่ละรายการของเป้าหมายที่เฉพาะเจาะจง

การแสดงภาพกราฟทรัพยากร Dependency (ไม่บังคับ)

ส่วนนี้อธิบายวิธีแสดงภาพเส้นทางการอ้างอิงสำหรับคำค้นหาที่เฉพาะเจาะจง Graphviz ช่วยให้เห็นเส้นทางเป็นภาพกราฟแบบมีทิศทางและไม่มีวัฏจักรแทนที่จะเป็นรายการแบบแบน คุณสามารถเปลี่ยนการแสดงกราฟการค้นหา Bazel ได้โดยใช้--outputตัวเลือกบรรทัดคำสั่งต่างๆ ดูตัวเลือกได้ที่รูปแบบเอาต์พุต

เริ่มต้นด้วยการเรียกใช้การค้นหาที่ต้องการ แล้วเพิ่มแฟล็ก --noimplicit_deps เพื่อนำการพึ่งพาเครื่องมือมากเกินไปออก จากนั้นใส่แฟล็กเอาต์พุตหลังการค้นหาและจัดเก็บกราฟลงในไฟล์ชื่อ graph.in เพื่อสร้างการแสดงกราฟเป็นข้อความ

หากต้องการค้นหาทรัพยากร Dependency ทั้งหมดของเป้าหมาย :runner และจัดรูปแบบเอาต์พุตเป็นกราฟ ให้ทำดังนี้

bazel query --noimplicit_deps 'deps(:runner)' --output graph > graph.in

ซึ่งจะสร้างไฟล์ชื่อ graph.in ซึ่งเป็นการแสดงกราฟการสร้างเป็นข้อความ Graphviz ใช้ dot ซึ่งเป็นเครื่องมือที่ประมวลผลข้อความเป็นภาพ เพื่อสร้าง PNG ดังนี้

dot -Tpng < graph.in > graph.png

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

แผนภาพแสดงความสัมพันธ์จากคาเฟ่ไปจนถึงเชฟและอาหาร ได้แก่ พิซซ่าและมักกะโรนีชีส ซึ่งแยกออกเป็นส่วนผสมต่างๆ ได้แก่ ชีส มะเขือเทศ แป้ง และมักกะโรนี

ซึ่งจะมีประโยชน์เมื่อคุณต้องการดูเอาต์พุตของฟังก์ชันการค้นหาต่างๆ ในคู่มือนี้

การค้นหาทรัพยากร Dependency ผกผัน

หากมีเป้าหมายที่ต้องการวิเคราะห์ว่าเป้าหมายอื่นๆ ใช้เป้าหมายนั้นอย่างไร คุณสามารถใช้การค้นหาเพื่อตรวจสอบว่าเป้าหมายใดขึ้นอยู่กับกฎหนึ่งๆ ซึ่งเรียกว่า "การอ้างอิงย้อนกลับ" การใช้ rdeps() มีประโยชน์เมื่อแก้ไขไฟล์ในโค้ดเบสที่คุณไม่คุ้นเคย และช่วยให้คุณไม่ต้องทำลายไฟล์อื่นๆ ที่ขึ้นอยู่กับไฟล์นั้นโดยไม่รู้ตัว

เช่น คุณต้องการแก้ไขส่วนผสม cheese หากต้องการหลีกเลี่ยงไม่ให้เกิดปัญหาสำหรับ Cafe Bazel คุณต้องตรวจสอบว่าเมนูใดที่ต้องใช้ cheese

หากต้องการดูว่าเป้าหมายใดขึ้นอยู่กับเป้าหมาย/แพ็กเกจใด คุณสามารถใช้ rdeps(universe_scope, target) ได้ ฟังก์ชันการค้นหา rdeps() รับอาร์กิวเมนต์อย่างน้อย 2 รายการ ได้แก่ universe_scope ซึ่งเป็นไดเรกทอรีที่เกี่ยวข้อง และ target Bazel จะค้นหาการอ้างอิงย้อนกลับของเป้าหมายภายใน universe_scope ที่ระบุ โอเปอเรเตอร์ rdeps() รับอาร์กิวเมนต์ที่ 3 ซึ่งเป็นอาร์กิวเมนต์ที่ไม่บังคับ ซึ่งเป็นค่าจำนวนเต็มที่ระบุขอบเขตบนของความลึกของการค้นหา

หากต้องการค้นหาการอ้างอิงย้อนกลับของเป้าหมาย cheese ภายในขอบเขตของทั้งโปรเจ็กต์ "//..." ให้เรียกใช้คำสั่งต่อไปนี้

bazel query "rdeps(universe_scope, target)"
ex) bazel query "rdeps(//... , //src/main/java/com/example/ingredients:cheese)"
//:runner
//src/main/java/com/example/dishes:macAndCheese
//src/main/java/com/example/dishes:pizza
//src/main/java/com/example/ingredients:cheese
//src/main/java/com/example/restaurant:cafe
//src/main/java/com/example/restaurant:chef

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

การค้นหาเป้าหมายตามแท็ก

ลูกค้า 2 คนเดินเข้าไปใน Bazel Cafe คือ Amir และ Jenny ไม่มีข้อมูลเกี่ยวกับบุคคลเหล่านี้เลยนอกจากชื่อ โชคดีที่พวกเขาติดแท็กคำสั่งซื้อในไฟล์ BUILD ของ "ลูกค้า" คุณจะเข้าถึงแท็กนี้ได้อย่างไร

นักพัฒนาแอปสามารถติดแท็กเป้าหมาย Bazel ด้วยตัวระบุต่างๆ ซึ่งมักใช้เพื่อวัตถุประสงค์ในการทดสอบ ตัวอย่างเช่น แท็กในการทดสอบสามารถใส่คำอธิบายประกอบบทบาทของการทดสอบในกระบวนการแก้ไขข้อบกพร่องและการเผยแพร่ โดยเฉพาะอย่างยิ่งสำหรับการทดสอบ C++ และ Python ซึ่งไม่มีความสามารถในการใส่คำอธิบายประกอบรันไทม์ การใช้แท็กและองค์ประกอบขนาดช่วยให้มีความยืดหยุ่นในการรวบรวมชุดการทดสอบตามนโยบายการเช็คอินของโค้ดเบส

ในตัวอย่างนี้ แท็กจะเป็น pizza หรือ macAndCheese เพื่อแสดงรายการเมนู คำสั่งนี้จะค้นหาเป้าหมายที่มีแท็กที่ตรงกับตัวระบุของคุณภายในแพ็กเกจหนึ่งๆ

bazel query 'attr(tags, "pizza", //src/main/java/com/example/customers/...)'

การค้นหานี้จะแสดงเป้าหมายทั้งหมดในแพ็กเกจ "ลูกค้า" ที่มีแท็ก "พิซซ่า"

ทดสอบตัวเอง

ใช้คำค้นหานี้เพื่อดูว่าเจนต้องการสั่งอะไร

คำตอบ

มักกะโรนีและชีส

การเพิ่มการอ้างอิงใหม่

Cafe Bazel ได้ขยายเมนูแล้ว ตอนนี้ลูกค้าสามารถสั่งสมูทตี้ได้แล้ว สมูทตี้สูตรนี้มีส่วนผสมคือ Strawberry และ Banana

ก่อนอื่น ให้เพิ่มส่วนผสมที่สมูทตี้ต้องใช้ ได้แก่ Strawberry.java และ Banana.java เพิ่มคลาส Java ที่ว่างเปล่า

src/main/java/com/example/ingredients/Strawberry.java

package com.example.ingredients;

public class Strawberry {

}

src/main/java/com/example/ingredients/Banana.java

package com.example.ingredients;

public class Banana {

}

จากนั้น ให้เพิ่ม Smoothie.java ไปยังไดเรกทอรีที่เหมาะสม: dishes

src/main/java/com/example/dishes/Smoothie.java

package com.example.dishes;

public class Smoothie {
    public static final String DISH_NAME = "Smoothie";
    public static final String DESCRIPTION = "Yummy and Refreshing";
}

สุดท้าย ให้เพิ่มไฟล์เหล่านี้เป็นกฎในไฟล์ BUILD ที่เหมาะสม สร้างไลบรารี Java ใหม่สำหรับส่วนผสมใหม่แต่ละรายการ รวมถึงชื่อ การแสดงผลต่อสาธารณะ และไฟล์ "src" ที่สร้างขึ้นใหม่ คุณควรมีไฟล์ BUILD ที่อัปเดตแล้วดังนี้

src/main/java/com/example/ingredients/BUILD

java_library(
    name = "cheese",
    visibility = ["//visibility:public"],
    srcs = ["Cheese.java"],
)

java_library(
    name = "dough",
    visibility = ["//visibility:public"],
    srcs = ["Dough.java"],
)

java_library(
    name = "macaroni",
    visibility = ["//visibility:public"],
    srcs = ["Macaroni.java"],
)

java_library(
    name = "tomato",
    visibility = ["//visibility:public"],
    srcs = ["Tomato.java"],
)

java_library(
    name = "strawberry",
    visibility = ["//visibility:public"],
    srcs = ["Strawberry.java"],
)

java_library(
    name = "banana",
    visibility = ["//visibility:public"],
    srcs = ["Banana.java"],
)

ในไฟล์ BUILD สำหรับเมนู คุณต้องการเพิ่มกฎใหม่สำหรับ Smoothie ซึ่งรวมถึงไฟล์ Java ที่สร้างขึ้นสำหรับ Smoothie เป็นไฟล์ "src" และกฎใหม่ที่คุณสร้างขึ้นสำหรับส่วนผสมแต่ละอย่างของสมูทตี้

src/main/java/com/example/dishes/BUILD

java_library(
    name = "macAndCheese",
    visibility = ["//visibility:public"],
    srcs = ["MacAndCheese.java"],
    deps = [
        "//src/main/java/com/example/ingredients:cheese",
        "//src/main/java/com/example/ingredients:macaroni",
    ],
)

java_library(
    name = "pizza",
    visibility = ["//visibility:public"],
    srcs = ["Pizza.java"],
    deps = [
        "//src/main/java/com/example/ingredients:cheese",
        "//src/main/java/com/example/ingredients:dough",
        "//src/main/java/com/example/ingredients:tomato",
    ],
)

java_library(
    name = "smoothie",
    visibility = ["//visibility:public"],
    srcs = ["Smoothie.java"],
    deps = [
        "//src/main/java/com/example/ingredients:strawberry",
        "//src/main/java/com/example/ingredients:banana",
    ],
)

สุดท้าย คุณต้องรวมสมูทตี้เป็นทรัพยากร Dependency ในไฟล์ BUILD ของเชฟ

src/main/java/com/example/restaurant/BUILD

java\_library(
    name = "chef",
    visibility = ["//visibility:public"],
    srcs = [
        "Chef.java",
    ],

    deps = [
        "//src/main/java/com/example/dishes:macAndCheese",
        "//src/main/java/com/example/dishes:pizza",
        "//src/main/java/com/example/dishes:smoothie",
    ],
)

java\_library(
    name = "cafe",
    visibility = ["//visibility:public"],
    srcs = [
        "Cafe.java",
    ],
    deps = [
        ":chef",
    ],
)

สร้าง cafe อีกครั้งเพื่อยืนยันว่าไม่มีข้อผิดพลาด หากสร้างสำเร็จ ก็ยินดีด้วย คุณได้เพิ่มการอ้างอิงใหม่สำหรับ "Cafe" หากไม่พบ ให้ตรวจสอบการสะกดคำและการตั้งชื่อแพ็กเกจ ดูข้อมูลเพิ่มเติมเกี่ยวกับการเขียนไฟล์ BUILD ได้ที่คู่มือสไตล์ของ BUILD

ตอนนี้ให้แสดงภาพกราฟการอ้างอิงใหม่โดยเพิ่ม Smoothie เพื่อเปรียบเทียบกับกราฟก่อนหน้า เพื่อความชัดเจน ให้ตั้งชื่ออินพุตกราฟเป็น graph2.in และ graph2.png

bazel query --noimplicit_deps 'deps(:runner)' --output graph > graph2.in
dot -Tpng < graph2.in > graph2.png

กราฟเดียวกันกับกราฟแรก แต่ตอนนี้มีกิ่งก้านที่แตกแขนงมาจากเป้าหมายเชฟที่มีสมูทตี้ ซึ่งนำไปสู่กล้วยและสตรอว์เบอร์รี

เมื่อดูที่ graph2.png คุณจะเห็นว่า Smoothie ไม่มีทรัพยากร Dependency ที่แชร์กับอาหารจานอื่นๆ แต่เป็นเพียงเป้าหมายอีกอย่างหนึ่งที่ Chef ต้องพึ่งพา

somepath() และ allpaths()

จะเกิดอะไรขึ้นหากคุณต้องการค้นหาว่าเหตุใดแพ็กเกจหนึ่งจึงขึ้นอยู่กับแพ็กเกจอื่น การแสดงเส้นทางการอ้างอิงระหว่างทั้ง 2 รายการจะให้คำตอบ

ฟังก์ชัน 2 รายการที่จะช่วยคุณค้นหาเส้นทางการอ้างอิง ได้แก่ somepath() และ allpaths() เมื่อกำหนดเป้าหมายเริ่มต้น S และจุดสิ้นสุด E ให้ค้นหาเส้นทางระหว่าง S กับ E โดยใช้ somepath(S,E)

ดูความแตกต่างระหว่าง 2 ฟังก์ชันนี้โดยดูความสัมพันธ์ระหว่างเป้าหมาย "Chef" และ "Cheese" เส้นทางที่เป็นไปได้ในการไปจากเป้าหมายหนึ่งไปยังอีกเป้าหมายหนึ่งมีดังนี้

  • Chef → MacAndCheese → Cheese
  • เชฟ → พิซซ่า → ชีส

somepath() จะให้เส้นทางเดียวจาก 2 ตัวเลือก ในขณะที่ "allpaths()" จะแสดงเส้นทางที่เป็นไปได้ทั้งหมด

ใช้ Cafe Bazel เป็นตัวอย่าง แล้วเรียกใช้คำสั่งต่อไปนี้

bazel query "somepath(//src/main/java/com/example/restaurant/..., //src/main/java/com/example/ingredients:cheese)"
//src/main/java/com/example/restaurant:cafe
//src/main/java/com/example/restaurant:chef
//src/main/java/com/example/dishes:macAndCheese
//src/main/java/com/example/ingredients:cheese

เอาต์พุตจะตามเส้นทางแรกของ Cafe → Chef → MacAndCheese → Cheese หากใช้ allpaths() แทน คุณจะได้รับสิ่งต่อไปนี้

bazel query "allpaths(//src/main/java/com/example/restaurant/..., //src/main/java/com/example/ingredients:cheese)"
//src/main/java/com/example/dishes:macAndCheese
//src/main/java/com/example/dishes:pizza
//src/main/java/com/example/ingredients:cheese
//src/main/java/com/example/restaurant:cafe
//src/main/java/com/example/restaurant:chef

เส้นทางเอาต์พุตของคาเฟ่ไปเชฟไปพิซซ่าไปมักกะโรนีชีสไปชีส

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

ทดสอบตัวเอง

ลูกค้าของ Cafe Bazel ได้เขียนรีวิวแรกให้กับร้านอาหาร ขออภัย รีวิวไม่มีรายละเอียดบางอย่าง เช่น ตัวตนของผู้รีวิวและจานที่รีวิวอ้างอิงถึง โชคดีที่คุณเข้าถึงข้อมูลนี้ได้ด้วย Bazel แพ็กเกจ reviews มีโปรแกรมที่พิมพ์รีวิวจากลูกค้าปริศนา สร้างและเรียกใช้ด้วยคำสั่งต่อไปนี้

bazel build //src/main/java/com/example/reviews:review
bazel-bin/src/main/java/com/example/reviews/review

หากใช้เฉพาะการค้นหา Bazel ให้ลองค้นหาว่าใครเป็นผู้เขียนรีวิวและรีวิวอาหารจานใด

คำใบ้

ตรวจสอบแท็กและการอ้างอิงเพื่อดูข้อมูลที่เป็นประโยชน์

คำตอบ

รีวิวนี้อธิบายถึงพิซซ่าและ Amir เป็นผู้รีวิว หากคุณดูว่ากฎนี้มีทรัพยากร Dependency ใดโดยใช้ bazel query --noimplicit\_deps 'deps(//src/main/java/com/example/reviews:review)' ผลลัพธ์ของคำสั่งนี้จะแสดงว่า Amir เป็นผู้ตรวจสอบ จากนั้น เนื่องจากคุณทราบว่าผู้ตรวจสอบคือ Amir คุณจึงใช้ฟังก์ชันการค้นหาเพื่อดูว่า Amir มีแท็กใดในไฟล์ `BUILD` เพื่อดูว่ามีอาหารจานใด คำสั่ง bazel query 'attr(tags, "pizza", //src/main/java/com/example/customers/...)' แสดงผลว่า Amir เป็นลูกค้าเพียงรายเดียวที่สั่งพิซซ่าและเป็นผู้รีวิว ซึ่งจะให้คำตอบแก่เรา

สรุป

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