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

กฎ Bazel Starlark อาจทำให้เกิดปัญหาความเข้ากันได้กับ Bazel LTS รุ่นต่างๆ ใน 2 กรณีต่อไปนี้

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

  1. กฎควรเป็นไปตาม Semantic Versioning โดยเวอร์ชันย่อยของเวอร์ชันหลักเดียวกันจะเข้ากันได้กับเวอร์ชันก่อนหน้า
  2. กฎที่ HEAD ควรเข้ากันได้กับ Bazel LTS รุ่นล่าสุด
  3. กฎที่ HEAD ควรเข้ากันได้กับ Bazel ที่ HEAD คุณสามารถทำได้โดย
  4. กฎเวอร์ชันหลักล่าสุดต้องเข้ากันได้กับ Bazel LTS รุ่นล่าสุด
  5. กฎเวอร์ชันหลักใหม่ควรเข้ากันได้กับ Bazel LTS รุ่นล่าสุดที่กฎเวอร์ชันหลักก่อนหน้าสนับสนุน

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

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

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

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