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

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

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

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

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

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

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

หากต้องการแสดงภาพกราฟการอ้างอิง จะมีการใช้เครื่องมือที่เรียกว่า 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 เพื่อค้นหาข้อมูลที่คุณต้องการ แต่ใช้ฟังก์ชันการค้นหาเพียงอย่างเดียวแทน เว้นแต่จะมีคำแนะนำเป็นอย่างอื่น

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

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

โปรเจ็กต์นี้มีวิธีการหลักภายใน 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 ให้ค้นหาทรัพยากร Dependency ที่สำคัญของเป้าหมายโดยการเรียกใช้คำสั่งต่อไปนี้

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 เพื่อนำทรัพยากร Dependency ของเครื่องมือที่มากเกินไปออก จากนั้น ทำตามการค้นหาที่มีแฟล็กเอาต์พุตและจัดเก็บกราฟลงในไฟล์ชื่อ 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 ค้นหาทรัพยากร Dependency แบบย้อนกลับของเป้าหมายภายใน universe_scope ที่ระบุ โอเปอเรเตอร์ rdeps() จะยอมรับอาร์กิวเมนต์ที่ 3 ซึ่งไม่บังคับ ซึ่งก็คือจำนวนเต็มลิเทอรัลที่ระบุขอบเขตบนของความลึกของการค้นหา

หากต้องการค้นหาทรัพยากร Dependency แบบย้อนกลับของเป้าหมาย 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

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

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

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

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

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

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

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

ทดสอบตัวเอง

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

คำตอบ

แมคแอนด์ชีส

การเพิ่มทรัพยากร Dependency ใหม่

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 อีกครั้งเพื่อยืนยันว่าไม่มีข้อผิดพลาด หากสร้างสำเร็จก็ขอแสดงความยินดีด้วย คุณได้เพิ่มทรัพยากร Dependency ใหม่สำหรับ "ร้านกาแฟ" แล้ว หากไม่เป็นเช่นนั้น ให้คอยดูคำที่สะกดผิดและการตั้งชื่อแพ็กเกจ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเขียนไฟล์ 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)

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

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

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() จะอ่านได้ยากขึ้นเล็กน้อยเนื่องจากเป็นรายการทรัพยากร Dependency ที่แยกเป็นหลายรายการ การนำเสนอกราฟนี้โดยใช้ Graphviz ช่วยให้เข้าใจความสัมพันธ์ได้ชัดเจนขึ้น

ทดสอบตัวเอง

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

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

ถามคำถามเกี่ยวกับ Bazel เพียงอย่างเดียว พยายามค้นหาว่าใครเป็นผู้เขียนรีวิว และพวกเขาอธิบายเมนูอาหารใด

คำใบ้

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

คำตอบ

รีวิวนี้อธิบายถึงพิซซ่าและอมรศักดิ์เป็นผู้รีวิว หากคุณเห็นทรัพยากร 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/...)' เอาต์พุตว่าอมรเป็นลูกค้าคนเดียวที่สั่งพิซซ่าและเป็นผู้รีวิวที่ให้คำตอบแก่เรา

ใกล้จะเสร็จแล้ว

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