Bazel กับ Gradle แตกต่างกันอย่างไร?


145

Google เพียงแค่เปิดมาสร้างเครื่องมือของBazel เครื่องมือนี้กับGradleแตกต่างกันอย่างไร สิ่งที่ Gradle ทำไม่สามารถทำได้มันทำอะไรได้ดีกว่าและ Gradle ทำอะไรได้ดีกว่า

คำตอบ:


171

ข้อจำกัดความรับผิดชอบ: ฉันทำงานกับ Bazel และฉันไม่คุ้นเคยกับ Gradle อย่างไรก็ตามหนึ่งในเพื่อนร่วมงานของฉันเขียนการเปรียบเทียบทั้งสองระบบซึ่งฉันจะแปลความหมายได้ที่นี่:

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

Gradle ให้ความสำคัญกับหลักการเดียวกันกับที่ Bazel ทำเช่นทีม Gradle ให้ความสำคัญอย่างมากกับประสิทธิภาพ (การสร้างที่เพิ่มขึ้น, การกำหนดค่าแบบขนานและการดำเนินการ, Gradle daemon), ความถูกต้อง (การตรวจสอบเนื้อหาที่เป็นปัจจุบัน) (การสนับสนุนที่หลากหลายสำหรับไวยากรณ์ที่ประกาศการกำหนดเวอร์ชันการอ้างอิงการประกาศที่อ้างอิงอย่างชัดเจน) และ Bazel เคารพต่อความต้องการเลย์เอาต์ของโครงการที่ยืดหยุ่น

ความแตกต่างกันเล็กน้อยคือ Gradle ต้องการส่งเสริมการฝึกฝนที่ดีในขณะที่ Bazel ต้องการที่จะใช้มัน Gradle มีจุดมุ่งหมายเพื่อเป็นจุดศูนย์กลางระหว่างประสบการณ์ Ant (อิสระในการกำหนดโครงสร้างโครงการของคุณเองด้วยผลลัพธ์ที่ไม่ต่อเนื่อง) และประสบการณ์ Maven (บังคับใช้แนวปฏิบัติที่ดีที่สุดโดยไม่มีที่ว่างสำหรับความต้องการโครงการที่แตกต่างกัน) Bazel เชื่อว่าการสนับสนุนโครงการที่มีความยืดหยุ่นนั้นเป็นไปได้โดยไม่ลดภาระการค้ำประกันที่แข็งแกร่งซึ่งทำให้เวิร์กโฟลว์มีประสิทธิภาพ

ปรัชญาทั้งสองนั้น“ ถูกต้อง” มากกว่า - เครื่องมือใดที่เหมาะกับโครงการที่สุดขึ้นอยู่กับค่าของโครงการนั้น

ภาพรวม Gradle

Gradle เป็นระบบที่มีความยืดหยุ่นสูงซึ่งทำให้ผู้ใช้สามารถสร้างโฟลว์การสร้างที่สมบูรณ์และเชื่อถือได้โดยมีข้อ จำกัด น้อยที่สุดเกี่ยวกับวิธีการจัดระเบียบโครงการของพวกเขา มันทำได้โดยการจัดหาบล็อคที่ทรงพลัง (เช่นการติดตามอัตโนมัติและการเรียกคืนการสนับสนุนปลั๊กอินที่ผสานรวมอย่างแน่นหนา) กับอินเตอร์เฟสสคริปต์ทั่วไปทัวริงที่สมบูรณ์ซึ่งสามารถรวมบล็อกเหล่านี้ได้ตามที่ผู้ใช้ต้องการ

Gradle เน้นคุณสมบัติดังต่อไปนี้:

  • โยกย้ายง่ายจากระบบอื่น Gradle รองรับองค์กรโครงการใด ๆ เพื่อใช้โครงสร้างเวิร์กโฟลว์ตามอำเภอใจได้ง่าย ทำความเข้าใจกับภารกิจ Ant และรวมเข้ากับที่เก็บ Maven และ Ivy
  • รูปแบบการเขียนสคริปต์ที่ขยายได้สูง ผู้ใช้ใช้บิลด์ตรรกะทั้งหมดโดยการเขียนสคริปต์ Groovy “ การสร้าง” เป็นเพียงการดำเนินการตามลำดับของการพึ่งพาของงานทั่วไปซึ่งโดยพื้นฐานแล้วจะเป็นคำจำกัดความวิธีการเปิดกว้าง
  • การจัดการการพึ่งพาที่หลากหลาย การอ้างอิงที่กำหนดเวอร์ชันสามารถประกาศและจัดลำดับโดยอัตโนมัติจากที่เก็บรหัสภายนอกระบบไฟล์ในเครื่องและโครงการ Gradle อื่น ๆ บิลด์บิวด์ก็สามารถเผยแพร่โดยอัตโนมัติไปยังที่เก็บและที่อื่น ๆ
  • ระบบปลั๊กอินที่ผสานรวมอย่างแน่นหนา ปลั๊กอินเป็นเพียงการรวมกลุ่มของงานที่จัดขึ้นเพื่ออำนวยความสะดวกเวิร์กโฟลว์ที่ต้องการ ฟีเจอร์ "แกนหลัก" ของ Gradle หลายตัวถูกนำไปใช้งานผ่านปลั๊กอิน (เช่น Java, Android) ปลั๊กอินโต้ตอบ (ขึ้นอยู่กับดุลยพินิจของพวกเขา) แน่นกับการสร้างสคริปต์ตรรกะ โปรแกรมเสริมเพลิดเพลินกับการเข้าถึงโครงสร้างข้อมูลหลักของ Gradle อย่างลึกซึ้ง

ภาพรวมของ Bazel

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

สิ่งนี้ให้รากฐานสำหรับเวิร์กโฟลว์การพัฒนาที่มีประสิทธิภาพซึ่งสร้างขึ้นรอบ ๆ บิลด์ที่สร้างซ้ำได้ซึ่ง“ บิวด์” กลายเป็นเอนทิตีนามธรรมที่สามารถอ้างอิงซ้ำส่งผ่านไปยังเครื่องต่าง ๆ และส่งผ่านไปยังโปรแกรมและบริการตามอำเภอใจ เหมือนเดิมทุกประการ.

Bazel เน้นคุณสมบัติดังต่อไปนี้:

  • ความถูกต้อง Bazel builds ได้รับการออกแบบมาเพื่อสร้างเอาต์พุตระยะเวลาที่ถูกต้องเสมอ หากผู้ใช้สองคนเรียกใช้งานบิลด์เดียวกันที่คอมมิตเดียวกันด้วยแฟล็ก Bazel เดียวกันบนเครื่องที่แตกต่างกันพวกเขาจะเห็นผลลัพธ์ที่เหมือนกัน บิวด์ที่เพิ่มขึ้นนั้นถูกต้องอย่างเชื่อถือได้เช่นเดียวกับบิวด์ที่สะอาด
  • ประสิทธิภาพ. บิลด์ได้รับการออกแบบเพื่อดำเนินการให้เร็วที่สุดเท่าที่จะเป็นไปได้ งานต่างๆนั้นสามารถขนานกันได้เท่าที่เครือข่ายการพึ่งพาอนุญาตให้ทำได้ งานที่ไม่จำเป็นจะไม่ถูกดำเนินการ (เช่นงานที่ "ทันสมัย" จะถูกข้ามไปเสมอ) การทำงานตามธรรมชาติสามารถส่งไปยังผู้ปฏิบัติการระยะไกลเพื่อเอาชนะข้อ จำกัด ของเครื่องท้องถิ่น
  • การทำสำเนาได้ อินสแตนซ์ของบิลด์ใด ๆ สามารถทำซ้ำอย่างซื่อสัตย์ในสภาพแวดล้อมใด ๆ ตัวอย่างเช่นหากรายงานข้อผิดพลาดระบุว่าซอฟต์แวร์ X รุ่น X ล้มเหลวในสภาพแวดล้อมการผลิต Z ผู้พัฒนาสามารถสร้างมันขึ้นมาใหม่บนเครื่องของตัวเองได้อย่างมั่นใจด้วยความมั่นใจว่าพวกเขากำลังดีบักสิ่งเดียวกัน

18
การเปรียบเทียบของทั้งสองระบบนั้นเป็นแบบสาธารณะหรือไม่ ถ้าใช่คุณแบ่งปันได้ไหม
Carlos Barcelona ใน

43

เนื่องจากลิงก์ของบทความมีแนวโน้มที่จะตายนี่คือบทสรุปของมุมมองของ Gradle Team เกี่ยวกับ Bazel (ส่วนใหญ่จะถูกยกออกจากบทความโดยตรงซึ่งตีพิมพ์ในเดือนมีนาคม 2015):

มันถูกออกแบบมาเพื่อแก้ปัญหาเฉพาะของ Google; codebase ขนาดใหญ่เสาหิน (LOC หลายร้อยล้าน)

ข้อได้เปรียบขนานที่ Bazel มอบให้นั้นจะถูกจับคู่โดย "การกำหนดค่าใหม่และรูปแบบส่วนประกอบของเรา" (จำไว้ว่าวันที่บทความนี้)

Bazel ไม่มีภาษาบิลด์ระดับสูงที่ทำให้บิลด์นั้นใช้งานง่ายสำหรับนักพัฒนา ที่ Google สามารถชดเชยได้ด้วยทีมบริการเฉพาะที่เป็นเจ้าของเครื่องมือสร้าง

Bazel ไม่ได้ถูกสร้างขึ้นมาเพื่อเพิ่มความสามารถ (แม้ว่าทีมพัฒนา Bazel จะตอบโต้ด้วยความมั่นใจว่าพวกเขากำลังขยายความสามารถ)

ความเร็วได้รับการปรับให้เหมาะสมกับแนวคิดที่ว่าการพึ่งพาสกรรมกริยาทั้งหมดจะถูกเก็บไว้ใน repo อันใหญ่ ไลบรารีและเครื่องมือทั้งหมดถูกเช็คอินในที่เก็บส่วนกลางนี้ องค์กรส่วนใหญ่มีข้อกำหนดการจัดการการพึ่งพาที่กระจายมากขึ้น

Bazel เป็น * ระวังเท่านั้นมันไม่ได้ทำงานบน Windows สิ่งนี้จะกำจัดองค์กรที่มีศักยภาพจำนวนมาก

ไม่มีระบบนิเวศปลั๊กอิน


17
ในฐานะที่เป็นอัปเดตสำหรับคำตอบนี้โปรดทราบว่า: 1. Bazel ได้ปรับปรุงเรื่องความสามารถในการขยายได้มากขึ้น (ตอนนี้ภาษาใหม่หลายภาษาได้รับการสนับสนุนจากชุมชน) 2. มีรุ่นทดลองใช้ Windows ( bazel.build/versions/master/docs/) windows.html ) การสนับสนุน Windows ควรปรับปรุงให้ดีขึ้นมากในปีนี้
Laurent

3
คำตอบนี้ไม่ถูกต้อง Bazel สามารถขยายได้ผ่านภาษาระดับสูงที่เรียกว่า Starlark ซึ่งคล้ายกับ Python มีระบบนิเวศของปลั๊กอิน Bazel ใช้งานได้บน Windows Bazel ไม่ต้องการ mono-repo
sdgfsdh

2
"การกำหนดค่าใหม่และรุ่นส่วนประกอบของเรา"ที่จะเกิดขึ้น ดูเหมือนว่าพวกเขาจะลบลิงก์ใด ๆ ไปยังที่อยู่ในบทความของ Gradle แต่ในปี 2014 ที่พวกเขาอาจจะพูดคุยเกี่ยวกับ"ตามกฎการตั้งค่ารูปแบบ"ซึ่งจะเลิกตอนนี้ การทดลองเล็กน้อยนั้นมีค่าใช้จ่าย Gradle มากเพราะเกือบจะแบ่งชุมชนออกเป็นครึ่ง
Renato

1

Gradle ส่วนใหญ่จะใช้ในระบบนิเวศ JVM (Java, Ggroovy, Scala, Kotlin ... ) หากโครงการของคุณอยู่ในพื้นที่นี้และคุณต้องถามคำถาม Gradle หรือ Maven จะเป็นตัวเลือกที่ดีกว่า ในการแก้ปัญหาการสร้าง Gradle คุณจะต้องต่อสู้กับ Java และระบบนิเวศ JVM เท่านั้น

Bazel ที่หัวใจมีความสามารถในการตรวจจับการเปลี่ยนแปลงที่เพิ่มขึ้น (เช่นเดียวกับการสร้างแคชแบบกระจาย) และอนุญาตให้คุณตอบสนองใช้ปลั๊กอิน / กฎเพื่อให้ได้บิลด์ที่เพิ่มขึ้น ในการตั้งค่าและบำรุงรักษาสิ่งนี้จำเป็นต้องมีความรู้เล็กน้อยใน CPP, Java และ Python (Skylark) และความรู้ของผู้ดูแลระบบเช่นกัน ถ้าคุณต้องถามคำถามฉันคิดว่า Gradle หรือ Maven จะเป็นการลงทุนที่ถูกกว่า ด้วย Bazel คุณสามารถสร้างภาษาใดก็ได้ตามที่คุณต้องการพลังที่เพิ่มขึ้น แต่ต้องเสียค่าใช้จ่าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.