กฎ Starlark ของ Bazel อาจทำให้ใช้งานร่วมกับรุ่น LTS ของ Bazel ไม่ได้ใน 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 | ❌ | ❌ | ❌ | ✅ |
❌: กฎเวอร์ชันหลักไม่มีเวอร์ชันใดที่เข้ากันได้กับรุ่น LTS ของ Bazel
✅: กฎอย่างน้อย 1 เวอร์ชันเข้ากันได้กับรุ่นล่าสุดของรุ่น LTS ของ Bazel
แนวทางปฏิบัติแนะนำ
ในฐานะผู้เขียนกฎ Bazel คุณสามารถทำให้ผู้ใช้ดำเนินการย้ายข้อมูลได้อย่างราบรื่นโดยทำตามแนวทางปฏิบัติแนะนำต่อไปนี้
- กฎควรเป็นไปตามการกำหนดเวอร์ชันทางอรรถศาสตร์: เวอร์ชันย่อยของเวอร์ชันหลักเดียวกันจะใช้งานร่วมกันได้ย้อนหลัง
- กฎที่ 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 ได้โดยไม่ทำให้เข้ากันไม่ได้กับรุ่น LTS ล่าสุดของ Bazel