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

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

กฎของ 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 จะถือว่าจัดการได้ เนื่องจากผู้ใช้อัปเกรดกัลกฎ_foo ได้ตั้งแต่ 2.x เป็น 3.x โดยไม่ต้องเปลี่ยนเวอร์ชัน Bazel หลัก จากนั้นอัปเกรด Bazel จาก 5.x เป็น 6.x
กฎ_foo 1.x กฎ_foo 2.x กฎ_foo 3.x หลัก
Bazel 4.x
Bazel 5.x
Bazel 6.x
หลัก

❌: เวอร์ชันกฎหลักที่ทํางานร่วมกับ 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

โดยทั่วไปแล้ว แนวทางที่เราแนะนําจะช่วยให้กฎต่างๆ สามารถย้ายข้อมูลเพื่อดูการเปลี่ยนแปลงที่ทํางานร่วมกันไม่ได้ของ Waze และใช้ประโยชน์จากฟีเจอร์ Bazel แบบใหม่ที่ HEAD โดยไม่ลดความเข้ากันได้กับ Bazel LTS รุ่นล่าสุด