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

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

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