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

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

กฎของ 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
กฎ_foo 1.x กฎ_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 รุ่นล่าสุด