กฎ Bazel Starlark อาจทำให้เกิดปัญหาความเข้ากันได้กับ Bazel LTS เวอร์ชันที่เผยแพร่ใน 2 กรณีต่อไปนี้
- กฎทำให้เกิดปัญหาความเข้ากันได้กับ LTS เวอร์ชันที่เผยแพร่ในอนาคต เนื่องจากระบบนำฟีเจอร์ที่กฎใช้ใน Bazel ออกจาก HEAD
- กฎทำให้เกิดปัญหาความเข้ากันได้กับ LTS เวอร์ชันปัจจุบันหรือเวอร์ชันเก่ากว่า เนื่องจากฟีเจอร์ที่กฎใช้มีให้บริการเฉพาะใน Bazel LTS เวอร์ชันใหม่กว่า
ในขณะเดียวกัน กฎเองก็อาจมีการเปลี่ยนแปลงที่ไม่เข้ากันกับผู้ใช้ด้วย เมื่อรวมกับการเปลี่ยนแปลงที่ทำให้เกิดปัญหาใน Bazel การอัปเกรดเวอร์ชันกฎและเวอร์ชัน Bazel มักจะเป็นสาเหตุที่ทำให้ผู้ใช้ Bazel รู้สึกหงุดหงิด หน้านี้จะอธิบายวิธีที่ผู้เขียนกฎควรดูแลรักษาความเข้ากันได้ของกฎกับ Bazel เพื่อให้ผู้ใช้อัปเกรด Bazel และกฎได้ง่ายขึ้น
กระบวนการย้ายข้อมูลที่จัดการได้
แม้ว่าการรับประกันความเข้ากันได้ระหว่าง Bazel ทุกเวอร์ชันกับกฎทุกเวอร์ชันจะเป็นไปไม่ได้ แต่เป้าหมายของเราคือการทำให้กระบวนการย้ายข้อมูลยังคงจัดการได้สำหรับผู้ใช้ Bazel กระบวนการย้ายข้อมูลที่จัดการได้หมายถึงกระบวนการที่ ผู้ใช้ไม่จำเป็นต้องอัปเกรดเวอร์ชันหลักของกฎและเวอร์ชันหลักของ Bazel พร้อมกัน ซึ่งจะช่วยให้ผู้ใช้จัดการการเปลี่ยนแปลงที่ไม่เข้ากันจากแหล่งที่มาทีละแหล่งได้
ตัวอย่างเช่น เมทริกซ์ความเข้ากันได้ต่อไปนี้
- การย้ายข้อมูลจาก 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 | ❌ | ❌ | ❌ | ✅ |
❌: ไม่มีเวอร์ชันหลักของกฎที่เข้ากันได้กับ Bazel LTS เวอร์ชันที่เผยแพร่
✅: กฎอย่างน้อย 1 เวอร์ชันเข้ากันได้กับ Bazel LTS เวอร์ชันที่เผยแพร่ล่าสุด
แนวทางปฏิบัติแนะนำ
ในฐานะผู้เขียนกฎ Bazel คุณสามารถทำให้กระบวนการย้ายข้อมูลจัดการได้สำหรับผู้ใช้โดยทำตามแนวทางปฏิบัติแนะนำต่อไปนี้
- กฎควรเป็นไปตาม Semantic Versioning โดยเวอร์ชันย่อยของเวอร์ชันหลักเดียวกันจะเข้ากันได้กับเวอร์ชันก่อนหน้า
- กฎใน HEAD ควรเข้ากันได้กับ Bazel LTS เวอร์ชันที่เผยแพร่ล่าสุด
- กฎใน HEAD ควรเข้ากันได้กับ Bazel ใน HEAD คุณสามารถทำได้ดังนี้
- ตั้งค่าการทดสอบ CI ของคุณเองด้วย Bazel ใน HEAD
- เพิ่มโปรเจ็กต์ลงในการทดสอบดาวน์สตรีมของ Bazel โดยทีม Bazel จะยื่นปัญหาไปยังโปรเจ็กต์ของคุณหากการเปลี่ยนแปลงที่ทำให้เกิดปัญหาใน Bazel ส่งผลต่อโปรเจ็กต์ของคุณ และคุณต้องปฏิบัติตามนโยบายโปรเจ็กต์ดาวน์สตรีม ของเราเพื่อแก้ไขปัญหาอย่างทันท่วงที
- เวอร์ชันหลักล่าสุดของกฎต้องเข้ากันได้กับ Bazel LTS เวอร์ชันที่เผยแพร่ล่าสุด
- เวอร์ชันหลักใหม่ของกฎควรเข้ากันได้กับ Bazel LTS เวอร์ชันที่เผยแพร่ล่าสุดซึ่งเวอร์ชันหลักก่อนหน้าของกฎรองรับ
การดำเนินการตามข้อ 2 และ 3 เป็นงานที่สำคัญที่สุด เนื่องจากจะช่วยให้ดำเนินการตามข้อ 4 และ 5 ได้ โดยธรรมชาติ
ผู้เขียนกฎสามารถทำสิ่งต่อไปนี้เพื่อให้เข้ากันได้กับทั้ง Bazel ใน HEAD และ Bazel LTS เวอร์ชันที่เผยแพร่ล่าสุดได้ง่ายขึ้น
- ขอให้ย้ายฟีเจอร์ที่เข้ากันได้กับเวอร์ชันก่อนหน้าไปยัง LTS เวอร์ชันที่เผยแพร่ล่าสุด โปรดดูรายละเอียดเพิ่มเติมในกระบวนการเผยแพร่
- ใช้ bazel_features เพื่อตรวจหาฟีเจอร์ Bazel
โดยทั่วไปแล้ว แนวทางที่แนะนำจะช่วยให้กฎย้ายข้อมูลสำหรับการเปลี่ยนแปลงที่ไม่เข้ากันของ Bazel และใช้ประโยชน์จากฟีเจอร์ใหม่ของ Bazel ใน HEAD ได้โดยไม่ทำให้เกิดปัญหาความเข้ากันได้กับ Bazel LTS เวอร์ชันที่เผยแพร่ล่าสุด