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

Google เพิ่งโอเพ่นซอร์สเครื่องมือสร้าง บาเซล. เครื่องมือนี้กับ Gradle แตกต่างกันอย่างไร Gradle ทำอะไรไม่ได้ อะไรดีกว่า และ Gradle ทำอะไรได้ดีกว่า


person user11171    schedule 25.03.2015    source แหล่งที่มา


คำตอบ (3)


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

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

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

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

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

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

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

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

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

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

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

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

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

person RCross    schedule 17.05.2016
comment
จากการอัปเดตสำหรับคำตอบนี้ โปรดทราบว่า: 1. Bazel ได้รับการปรับปรุงอย่างมากเกี่ยวกับความสามารถในการขยาย (ขณะนี้รองรับภาษาใหม่หลายภาษาด้วยชุมชน) 2. มี Windows เวอร์ชันทดลอง (bazel.build/versions/master/docs/windows.html) การสนับสนุน Windows ควรปรับปรุงมากในปีนี้ - person Laurent; 22.03.2017
comment
คำตอบนี้ไม่ถูกต้อง Bazel สามารถขยายได้ผ่านภาษาระดับสูงที่เรียกว่า Starlark ซึ่งคล้ายกับ Python มาก มีระบบนิเวศของปลั๊กอิน Bazel ทำงานบน Windows Bazel ไม่ต้องการ mono-repo - person sdgfsdh; 15.03.2019
comment
การกำหนดค่าและโมเดลส่วนประกอบใหม่ที่กำลังจะมาถึงของเราที่ไม่เคยเกิดขึ้น ดูเหมือนว่าพวกเขาจะลบลิงก์ใด ๆ ไปยังสิ่งนั้นในบทความของ Gradle แต่ในปี 2014 พวกเขาอาจพูดถึงการกำหนดค่าโมเดลตามกฎ ซึ่งก็คือ เลิกใช้งานแล้ว การทดลองเล็กๆ น้อยๆ นั้นทำให้ Gradle เสียค่าใช้จ่ายมาก เนื่องจากเกือบจะแบ่งชุมชนออกเป็นสองส่วน - person Renato; 22.04.2019

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

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

person HoaPhan    schedule 03.11.2019