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

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

กฎของ Bazel Starlark ทำลายความเข้ากันได้กับรุ่น Bazel LTS ใน 2 สถานการณ์ต่อไปนี้

  1. กฎนี้จะเข้ากันไม่ได้กับรุ่น LTS รุ่นต่อๆ ไปเนื่องจากฟีเจอร์ ที่ขึ้นอยู่กับ ถูกนำออกจาก Bazel ที่ HEAD
  2. กฎเข้ากันไม่ได้กับรุ่น LTS ปัจจุบันหรือรุ่นเก่ากว่าเนื่องจาก ฟีเจอร์ที่ต้องใช้มีใน Bazel LTS รุ่นใหม่เท่านั้น

ในขณะเดียวกัน กฎเองก็สามารถส่งการเปลี่ยนแปลง ที่เข้ากันไม่ได้ให้กับผู้ใช้ตาม เมื่อใช้ร่วมกับการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบใน Bazel การอัปเกรดเวอร์ชันของกฎ และเวอร์ชัน Bazel นั้น มักเป็นสาเหตุที่ทำให้ผู้ใช้ Bazel รู้สึกไม่พอใจ ช่วงเวลานี้ หน้าครอบคลุมวิธีที่ผู้เขียนกฎควรรักษาความเข้ากันได้ของกฎกับ Bazel เพื่อ ทำให้ผู้ใช้สามารถอัปเกรด Bazel และกฎต่างๆ ได้ง่ายขึ้น

กระบวนการย้ายข้อมูลที่จัดการได้

ในขณะที่คุณไม่สามารถรับประกันความเข้ากันได้ระหว่างทุกๆ ของ Bazel และกฎทุกเวอร์ชัน เป้าหมายของเราคือการดูแลให้ ผู้ใช้ Bazel ยังคงสามารถจัดการกระบวนการย้ายข้อมูลได้ การย้ายข้อมูลที่จัดการได้ กระบวนการหมายถึงกระบวนการที่ผู้ใช้ไม่ได้ถูกบังคับให้อัปเกรด เวอร์ชันหลักของกฎ และเวอร์ชันหลักของ Bazel พร้อมกัน ด้วยเหตุนี้ ทำให้ผู้ใช้สามารถจัดการการเปลี่ยนแปลงที่ทำงานร่วมกันไม่ได้ จากแหล่งข้อมูลครั้งละ 1 แห่ง

ตัวอย่างเช่น มีเมทริกซ์ความเข้ากันได้ต่อไปนี้

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

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

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

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

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