แนวทางปฏิบัติแนะนำ

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

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

เป้าหมายโดยรวมมีดังนี้

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

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

หน้านี้ใช้ระดับข้อกำหนดที่อธิบายไว้ใน RFC นี้

การเรียกใช้บิลด์และการทดสอบ

โปรเจ็กต์ควรเรียกใช้ bazel build //... และ bazel test //... ในสาขาที่เสถียรได้เสมอ เป้าหมายที่จำเป็น แต่ไม่ได้สร้างภายใต้สถานการณ์บางอย่าง (เช่น ต้องใช้บิลด์ที่เฉพาะเจาะจง ไม่ได้สร้างในแพลตฟอร์มหนึ่งๆ ต้องมีข้อตกลงใบอนุญาต) ควร ติดแท็กให้เฉพาะเจาะจงมากที่สุด (เช่น "requires-osx") การติดแท็กนี้ช่วยให้กรองเป้าหมายได้ในระดับที่ละเอียดยิ่งกว่าแท็ก "ด้วยตนเอง" และช่วยให้ผู้ที่ตรวจสอบไฟล์ BUILD เข้าใจข้อจำกัดของเป้าหมาย

ทรัพยากร Dependency ของบุคคลที่สาม

คุณอาจประกาศการอ้างอิงของบุคคลที่สามได้ดังนี้

  • หรือประกาศเป็นที่เก็บระยะไกลในไฟล์ MODULE.bazel
  • หรือวางไว้ในไดเรกทอรีที่ชื่อ third_party/ ในไดเรกทอรีพื้นที่ทำงาน

ขึ้นอยู่กับไบนารี

ควรสร้างทุกอย่างจากแหล่งที่มาทุกครั้งที่เป็นไปได้ โดยทั่วไปแล้ว วิธีนี้หมายความว่าแทนที่จะขึ้นอยู่กับไลบรารี some-library.so คุณจะต้องสร้างไฟล์ BUILD และสร้าง some-library.so จากแหล่งที่มาของไฟล์ จากนั้นจึงขึ้นอยู่กับเป้าหมายดังกล่าว

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

การกำหนดเวอร์ชัน

ขอแนะนำให้สร้างโค้ดทั้งหมดจากส่วนหัวทุกครั้งที่เป็นไปได้ เมื่อต้องใช้เวอร์ชัน ให้หลีกเลี่ยงการใส่เวอร์ชันในชื่อเป้าหมาย (เช่น //guava ไม่ใช่ //guava-20.0) การตั้งชื่อแบบนี้จะช่วยให้อัปเดตไลบรารีได้ง่ายขึ้น (ต้องอัปเดตเป้าหมายเพียงรายการเดียว) นอกจากนี้ ยังมีความยืดหยุ่นมากขึ้นต่อปัญหาการขึ้นต่อกันแบบไดมอนด์ หากไลบรารีหนึ่งขึ้นอยู่กับ guava-19.0 และอีกไลบรารีหนึ่งขึ้นอยู่กับ guava-20.0 คุณอาจมีไลบรารีที่พยายามขึ้นอยู่กับ 2 เวอร์ชันที่แตกต่างกัน หากคุณสร้างนามแฝงที่ทำให้เข้าใจผิดเพื่อชี้เป้าทั้ง 2 รายการไปยังไลบรารี guava เดียวกัน แสดงว่าไฟล์ BUILD ทำให้เข้าใจผิด

การใช้ไฟล์ .bazelrc

สำหรับตัวเลือกเฉพาะโปรเจ็กต์ ให้ใช้ไฟล์การกำหนดค่าของคุณ workspace/.bazelrc (ดูรูปแบบ bazelrc)

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

try-import %workspace%/user.bazelrc

(หรือชื่อไฟล์อื่นๆ) ใน workspace/.bazelrc แล้วเพิ่ม user.bazelrc ลงใน .gitignore

Open Source bazelrc-preset.bzl {: .external} จะสร้างไฟล์ bazelrc ที่กำหนดเองซึ่งตรงกับเวอร์ชัน Bazel ของคุณและมี ค่าที่กำหนดไว้ล่วงหน้าของแฟล็กที่แนะนำ

แพ็กเกจ

ทุกไดเรกทอรีที่มีไฟล์ที่สร้างได้ควรเป็นแพ็กเกจ หากBUILD ไฟล์อ้างอิงถึงไฟล์ในไดเรกทอรีย่อย (เช่น srcs = ["a/b/C.java"]) แสดงว่าควรเพิ่มไฟล์ BUILD ลงในไดเรกทอรีย่อยนั้น ยิ่งโครงสร้างนี้มีอยู่นานเท่าใด ก็ยิ่งมีแนวโน้มที่จะสร้างการอ้างอิงแบบวงกลมโดยไม่ตั้งใจ ขอบเขตของเป้าหมายจะขยายออก และจะต้องอัปเดตการอ้างอิงย้อนกลับจำนวนมากขึ้น