กฎของ 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
กฎ_ฟู 1.x | rules_foo 2.x | กฎ_foo 3.x | HEAD | |
---|---|---|---|---|
Bazel 4.x | ✅ | ❌ | ❌ | ❌ |
Bazel 5.x | ❌ | ✅ | ✅ | ❌ |
Bazel 6.x | ❌ | ❌ | ✅ | ✅ |
HEAD | ❌ | ❌ | ❌ | ✅ |
❌: ไม่มีเวอร์ชันกฎหลักที่ใช้งานร่วมกับรุ่น Bazel LTS ได้
✅: กฎอย่างน้อย 1 เวอร์ชันใช้งานร่วมกับเวอร์ชันล่าสุดของ Bazel LTS ได้
แนวทางปฏิบัติแนะนำ
ในฐานะผู้เขียนกฎ 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 โดยไม่ลดความเข้ากันได้กับรุ่นล่าสุดของ Bazel LTS