ความเข้ากันได้ของกฎ

กฎ Bazel Starlark อาจทำให้ความเข้ากันได้กับรุ่น Bazel LTS เสียหายใน 2 สถานการณ์ต่อไปนี้

  1. กฎนี้ทำให้ไม่สามารถใช้งานร่วมกับรุ่น LTS ในอนาคตได้เนื่องจากมีการนำฟีเจอร์ที่กฎนี้ ขึ้นอยู่กับออกจาก Bazel ที่ HEAD
  2. กฎนี้ทำให้เกิดความไม่เข้ากันกับรุ่น LTS ปัจจุบันหรือรุ่นเก่ากว่า เนื่องจาก ฟีเจอร์ที่กฎนี้ขึ้นอยู่ด้วยมีเฉพาะในรุ่น LTS ของ Bazel ที่ใหม่กว่า

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

กระบวนการย้ายข้อมูลที่จัดการได้

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

ตัวอย่างเช่น หากมีเมทริกซ์ความเข้ากันได้ต่อไปนี้

  • การย้ายข้อมูลจาก rules_foo 1.x + Bazel 4.x ไปยัง rules_foo 2.x + Bazel 5.x ถือว่าจัดการได้ยาก เนื่องจากผู้ใช้ต้องอัปเกรดเวอร์ชันหลักของ rules_foo และ Bazel พร้อมกัน
  • การย้ายข้อมูลจาก rules_foo 2.x + Bazel 5.x ไปยัง rules_foo 3.x + Bazel 6.x ถือว่าจัดการได้ เนื่องจากผู้ใช้สามารถอัปเกรด rules_foo จาก 2.x เป็น 3.x ก่อนได้โดยไม่ต้องเปลี่ยน Bazel เวอร์ชันหลัก จากนั้นจึงอัปเกรด Bazel จาก 5.x เป็น 6.x
rules_foo 1.x rules_foo 2.x rules_foo 3.x HEAD
Bazel 4.x
Bazel 5.x
Bazel 6.x
HEAD

❌: เวอร์ชันของเวอร์ชันกฎหลักไม่สามารถใช้งานร่วมกับรุ่น LTS ของ Bazel ได้

✅: กฎอย่างน้อย 1 เวอร์ชันเข้ากันได้กับ Bazel LTS เวอร์ชันล่าสุด

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

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

  1. กฎควรเป็นไปตามการกำหนดเวอร์ชันทางอรรถศาสตร์: เวอร์ชันย่อยของเวอร์ชัน หลักเดียวกันจะมีความเข้ากันได้แบบย้อนหลัง
  2. กฎที่ HEAD ควรเข้ากันได้กับ Bazel LTS เวอร์ชันล่าสุด
  3. กฎที่ HEAD ควรเข้ากันได้กับ Bazel ที่ HEAD หากต้องการทำเช่นนี้ คุณสามารถ
    • ตั้งค่าการทดสอบ CI ของคุณเองด้วย Bazel ที่ HEAD
    • เพิ่มโปรเจ็กต์ของคุณไปยังการทดสอบดาวน์สตรีมของ Bazel ทีม Bazel จะบันทึกปัญหาในโปรเจ็กต์ของคุณหากการเปลี่ยนแปลงที่ไม่รองรับใน Bazel ส่งผลต่อโปรเจ็กต์ของคุณ และคุณต้องปฏิบัติตามนโยบายโปรเจ็กต์ดาวน์สตรีม เพื่อแก้ไขปัญหาอย่างทันท่วงที
  4. กฎเวอร์ชันหลักล่าสุดต้องเข้ากันได้กับ Bazel LTS เวอร์ชันล่าสุด
  5. กฎเวอร์ชันหลักใหม่ควรใช้ได้กับ Bazel LTS เวอร์ชันล่าสุดที่กฎเวอร์ชันหลักก่อนหน้ารองรับ

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

หากต้องการให้การรักษาความเข้ากันได้กับทั้ง Bazel ที่ HEAD และ Bazel LTS เวอร์ชันล่าสุดเป็นเรื่องง่ายขึ้น ผู้เขียนกฎสามารถทำสิ่งต่อไปนี้ได้

  • หากต้องการขอให้ย้อนกลับฟีเจอร์ที่เข้ากันได้กับรุ่นก่อนหน้าไปยังรุ่น LTS ล่าสุด โปรดดูรายละเอียดเพิ่มเติมในกระบวนการเผยแพร่
  • ใช้ bazel_features เพื่อตรวจหาฟีเจอร์ Bazel

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