คำตอบ:
ข้อจำกัดความรับผิดชอบ: ฉันทำงานกับ Bazel และฉันไม่คุ้นเคยกับ Gradle อย่างไรก็ตามหนึ่งในเพื่อนร่วมงานของฉันเขียนการเปรียบเทียบทั้งสองระบบซึ่งฉันจะแปลความหมายได้ที่นี่:
Bazel และ Gradle เน้นแง่มุมต่าง ๆ ของการสร้างประสบการณ์ ในระดับหนึ่งลำดับความสำคัญของพวกเขาเข้ากันไม่ได้ - ความปรารถนาของ Gradle สำหรับความยืดหยุ่นและการไม่ จำกัด ขอบเขตที่สามารถวางบนโครงสร้างการสร้างในขณะที่ความปรารถนาของ Bazel สำหรับความน่าเชื่อถือและประสิทธิภาพจำเป็นต้องบังคับ
Gradle ให้ความสำคัญกับหลักการเดียวกันกับที่ Bazel ทำเช่นทีม Gradle ให้ความสำคัญอย่างมากกับประสิทธิภาพ (การสร้างที่เพิ่มขึ้น, การกำหนดค่าแบบขนานและการดำเนินการ, Gradle daemon), ความถูกต้อง (การตรวจสอบเนื้อหาที่เป็นปัจจุบัน) (การสนับสนุนที่หลากหลายสำหรับไวยากรณ์ที่ประกาศการกำหนดเวอร์ชันการอ้างอิงการประกาศที่อ้างอิงอย่างชัดเจน) และ Bazel เคารพต่อความต้องการเลย์เอาต์ของโครงการที่ยืดหยุ่น
ความแตกต่างกันเล็กน้อยคือ Gradle ต้องการส่งเสริมการฝึกฝนที่ดีในขณะที่ Bazel ต้องการที่จะใช้มัน Gradle มีจุดมุ่งหมายเพื่อเป็นจุดศูนย์กลางระหว่างประสบการณ์ Ant (อิสระในการกำหนดโครงสร้างโครงการของคุณเองด้วยผลลัพธ์ที่ไม่ต่อเนื่อง) และประสบการณ์ Maven (บังคับใช้แนวปฏิบัติที่ดีที่สุดโดยไม่มีที่ว่างสำหรับความต้องการโครงการที่แตกต่างกัน) Bazel เชื่อว่าการสนับสนุนโครงการที่มีความยืดหยุ่นนั้นเป็นไปได้โดยไม่ลดภาระการค้ำประกันที่แข็งแกร่งซึ่งทำให้เวิร์กโฟลว์มีประสิทธิภาพ
ปรัชญาทั้งสองนั้น“ ถูกต้อง” มากกว่า - เครื่องมือใดที่เหมาะกับโครงการที่สุดขึ้นอยู่กับค่าของโครงการนั้น
Gradle เป็นระบบที่มีความยืดหยุ่นสูงซึ่งทำให้ผู้ใช้สามารถสร้างโฟลว์การสร้างที่สมบูรณ์และเชื่อถือได้โดยมีข้อ จำกัด น้อยที่สุดเกี่ยวกับวิธีการจัดระเบียบโครงการของพวกเขา มันทำได้โดยการจัดหาบล็อคที่ทรงพลัง (เช่นการติดตามอัตโนมัติและการเรียกคืนการสนับสนุนปลั๊กอินที่ผสานรวมอย่างแน่นหนา) กับอินเตอร์เฟสสคริปต์ทั่วไปทัวริงที่สมบูรณ์ซึ่งสามารถรวมบล็อกเหล่านี้ได้ตามที่ผู้ใช้ต้องการ
Gradle เน้นคุณสมบัติดังต่อไปนี้:
Bazel วิวัฒนาการมาจากความจำเป็นในการสร้างโครงการ Google ภายในที่เชื่อถือได้และมีประสิทธิภาพ เนื่องจากสภาพแวดล้อมการพัฒนาของ Google นั้นมีขนาดใหญ่และซับซ้อนเป็นพิเศษ Bazel จึงเสนอการรับประกันที่แข็งแกร่งเป็นพิเศษเกี่ยวกับความสมบูรณ์ของงานสร้างและค่าใช้จ่ายที่ต่ำเป็นพิเศษในการบรรลุเป้าหมาย
สิ่งนี้ให้รากฐานสำหรับเวิร์กโฟลว์การพัฒนาที่มีประสิทธิภาพซึ่งสร้างขึ้นรอบ ๆ บิลด์ที่สร้างซ้ำได้ซึ่ง“ บิวด์” กลายเป็นเอนทิตีนามธรรมที่สามารถอ้างอิงซ้ำส่งผ่านไปยังเครื่องต่าง ๆ และส่งผ่านไปยังโปรแกรมและบริการตามอำเภอใจ เหมือนเดิมทุกประการ.
Bazel เน้นคุณสมบัติดังต่อไปนี้:
เนื่องจากลิงก์ของบทความมีแนวโน้มที่จะตายนี่คือบทสรุปของมุมมองของ Gradle Team เกี่ยวกับ Bazel (ส่วนใหญ่จะถูกยกออกจากบทความโดยตรงซึ่งตีพิมพ์ในเดือนมีนาคม 2015):
มันถูกออกแบบมาเพื่อแก้ปัญหาเฉพาะของ Google; codebase ขนาดใหญ่เสาหิน (LOC หลายร้อยล้าน)
ข้อได้เปรียบขนานที่ Bazel มอบให้นั้นจะถูกจับคู่โดย "การกำหนดค่าใหม่และรูปแบบส่วนประกอบของเรา" (จำไว้ว่าวันที่บทความนี้)
Bazel ไม่มีภาษาบิลด์ระดับสูงที่ทำให้บิลด์นั้นใช้งานง่ายสำหรับนักพัฒนา ที่ Google สามารถชดเชยได้ด้วยทีมบริการเฉพาะที่เป็นเจ้าของเครื่องมือสร้าง
Bazel ไม่ได้ถูกสร้างขึ้นมาเพื่อเพิ่มความสามารถ (แม้ว่าทีมพัฒนา Bazel จะตอบโต้ด้วยความมั่นใจว่าพวกเขากำลังขยายความสามารถ)
ความเร็วได้รับการปรับให้เหมาะสมกับแนวคิดที่ว่าการพึ่งพาสกรรมกริยาทั้งหมดจะถูกเก็บไว้ใน repo อันใหญ่ ไลบรารีและเครื่องมือทั้งหมดถูกเช็คอินในที่เก็บส่วนกลางนี้ องค์กรส่วนใหญ่มีข้อกำหนดการจัดการการพึ่งพาที่กระจายมากขึ้น
Bazel เป็น * ระวังเท่านั้นมันไม่ได้ทำงานบน Windows สิ่งนี้จะกำจัดองค์กรที่มีศักยภาพจำนวนมาก
ไม่มีระบบนิเวศปลั๊กอิน
Gradle ส่วนใหญ่จะใช้ในระบบนิเวศ JVM (Java, Ggroovy, Scala, Kotlin ... ) หากโครงการของคุณอยู่ในพื้นที่นี้และคุณต้องถามคำถาม Gradle หรือ Maven จะเป็นตัวเลือกที่ดีกว่า ในการแก้ปัญหาการสร้าง Gradle คุณจะต้องต่อสู้กับ Java และระบบนิเวศ JVM เท่านั้น
Bazel ที่หัวใจมีความสามารถในการตรวจจับการเปลี่ยนแปลงที่เพิ่มขึ้น (เช่นเดียวกับการสร้างแคชแบบกระจาย) และอนุญาตให้คุณตอบสนองใช้ปลั๊กอิน / กฎเพื่อให้ได้บิลด์ที่เพิ่มขึ้น ในการตั้งค่าและบำรุงรักษาสิ่งนี้จำเป็นต้องมีความรู้เล็กน้อยใน CPP, Java และ Python (Skylark) และความรู้ของผู้ดูแลระบบเช่นกัน ถ้าคุณต้องถามคำถามฉันคิดว่า Gradle หรือ Maven จะเป็นการลงทุนที่ถูกกว่า ด้วย Bazel คุณสามารถสร้างภาษาใดก็ได้ตามที่คุณต้องการพลังที่เพิ่มขึ้น แต่ต้องเสียค่าใช้จ่าย