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

รายงานปัญหา ดูแหล่งที่มา

กฎของ 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
กฎ_ฟู 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 คุณจะตรวจสอบกระบวนการย้ายข้อมูลที่จัดการได้สำหรับผู้ใช้โดยทำตามแนวทางปฏิบัติแนะนำต่อไปนี้

  1. กฎควรเป็นไปตามการกำหนดเวอร์ชันเชิงความหมาย กล่าวคือเวอร์ชันย่อยของเวอร์ชันหลักเดียวกันจะเข้ากันได้แบบย้อนหลัง
  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