Sự khác biệt giữa Bazel và Gradle là gì?


Câu trả lời:


171

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc tại Bazel và tôi không quen thuộc lắm với Gradle. Tuy nhiên, một trong những đồng nghiệp của tôi đã viết một so sánh về hai hệ thống, mà tôi sẽ diễn giải ở đây:

Bazel và Gradle nhấn mạnh các khía cạnh khác nhau của kinh nghiệm xây dựng. Ở một mức độ nào đó, các ưu tiên của chúng không tương thích - Mong muốn linh hoạt và không gây khó chịu của Gradle hạn chế các hạn chế mà nó có thể đặt ra đối với cấu trúc xây dựng, trong khi mong muốn về độ tin cậy và hiệu suất của Bazel nhất thiết phải thực thi các hạn chế không thể thương lượng.

Gradle đánh giá cao các nguyên tắc tương tự như Bazel thực hiện, tức là nhóm Gradle rất chú trọng đến hiệu suất (xây dựng gia tăng, cấu hình và thực thi song song, daemon Gradle), tính chính xác (kiểm tra cập nhật dựa trên nội dung) và khả năng tái tạo (hỗ trợ phong phú cho cú pháp khai báo, phiên bản phụ thuộc, phụ thuộc được khai báo rõ ràng). Và Bazel tôn trọng sự cần thiết cho bố trí dự án linh hoạt.

Sắc thái là Gradle muốn thúc đẩy thực hành tốt trong khi Bazel muốn yêu cầu nó. Gradle nhắm đến một nền tảng trung gian giữa trải nghiệm Ant (tự do xác định cấu trúc dự án của riêng bạn với kết quả không mạch lạc) và trải nghiệm Maven (thực thi tốt nhất không có chỗ cho các nhu cầu dự án khác nhau). Bazel tin rằng có thể hỗ trợ dự án linh hoạt mà không phải hy sinh những đảm bảo mạnh mẽ cho phép quy trình công việc mạnh mẽ của mình.

Không phải triết lý nào cũng đúng hơn, đúng - bất kỳ công cụ nào phù hợp nhất với dự án đều phụ thuộc vào giá trị của dự án cụ thể đó.

Tổng quan về lớp

Gradle là một hệ thống rất linh hoạt giúp người dùng dễ dàng xây dựng các luồng xây dựng hoàn chỉnh, đáng tin cậy với các ràng buộc tối thiểu về cách họ tổ chức các dự án của họ. Nó thực hiện điều này bằng cách cung cấp các khối xây dựng mạnh mẽ (ví dụ: theo dõi và truy xuất phụ thuộc tự động, hỗ trợ plugin tích hợp chặt chẽ) với giao diện kịch bản chung, Turing-Complete, có thể kết hợp các khối này theo ý muốn của người dùng.

Gradle nhấn mạnh các tính năng sau:

  • Dễ dàng di chuyển từ các hệ thống khác. Gradle dễ dàng cung cấp cho bất kỳ tổ chức dự án để dễ dàng thực hiện các cấu trúc dòng công việc tùy ý. Nó thực sự hiểu các nhiệm vụ của Ant và tích hợp với các kho lưu trữ của Maven và Ivy.
  • Mô hình kịch bản mở rộng cao. Người dùng thực hiện tất cả logic xây dựng bằng cách viết các tập lệnh Groovy. Một bản dựng xây dựng, chỉ đơn giản là một thực thi tuần tự phụ thuộc của các tác vụ chung, về cơ bản là các định nghĩa phương thức mở rộng, có thể mở rộng, có thể mở rộng.
  • Quản lý phụ thuộc phong phú. Các phụ thuộc được phiên bản có thể được khai báo và tự động dàn dựng từ các kho mã bên ngoài, các hệ thống tệp cục bộ và các dự án Gradle khác. Xây dựng đầu ra cũng có thể được tự động xuất bản đến kho và các vị trí khác.
  • Hệ thống plugin tích hợp chặt chẽ. Plugin chỉ đơn giản là các gói nhiệm vụ được tổ chức để tạo điều kiện cho một quy trình công việc mong muốn. Nhiều tính năng "cốt lõi" của Gradle thực sự được triển khai thông qua các plugin (ví dụ: Java, Android). Các plugin tương tác (theo ý của họ) chặt chẽ với logic xây dựng tập lệnh. Các plugin tận hưởng truy cập sâu vào các cấu trúc dữ liệu cốt lõi của Gradle.

Tổng quan về Bazel

Bazel đã phát triển ra khỏi nhu cầu xây dựng các dự án nội bộ của Google một cách đáng tin cậy và hiệu quả. Do môi trường phát triển của Google rộng lớn và phức tạp một cách bất thường, Bazel cung cấp các đảm bảo mạnh mẽ khác thường về tính toàn vẹn của các bản dựng và hiệu suất thấp bất thường trong việc đạt được chúng.

Điều này cung cấp nền tảng cho các quy trình phát triển mạnh mẽ được xây dựng xung quanh các bản dựng có thể tái tạo, trong đó một bản dựng xây dựng trở thành một thực thể trừu tượng có thể được tham chiếu, lặp lại, chuyển qua các máy khác nhau và được chuyển đến các chương trình và dịch vụ tùy ý sao cho mọi trường hợp đều được biết đến giống hệt nhau.

Bazel nhấn mạnh các tính năng sau:

  • Đúng. Các bản dựng của Bazel được thiết kế để luôn tạo ra đầu ra, thời gian chính xác. Nếu hai người dùng gọi cùng một bản dựng tại cùng một cam kết với cùng các cờ Bazel trên các máy khác nhau, họ sẽ thấy kết quả giống hệt nhau. Các bản dựng tăng dần cũng chính xác như các bản dựng sạch, khiến cho bản dựng sau về cơ bản không cần thiết.
  • Hiệu suất. Các bản dựng được thiết kế để thực thi nhanh nhất có thể dựa trên các tài nguyên có sẵn cho chúng. Nhiệm vụ là song song như chuỗi phụ thuộc của họ cho phép. Công việc không cần thiết không bao giờ được thực hiện (tức là các nhiệm vụ cập nhật của luôn luôn bị bỏ qua). Công việc tự nhiên có thể được đưa ra cho các nhà điều hành từ xa để vượt qua giới hạn máy cục bộ.
  • Khả năng tái lập. Bất kỳ trường hợp nào của bản dựng có thể được sao chép một cách trung thực trong bất kỳ môi trường nào. Ví dụ: nếu một báo cáo lỗi cho biết phiên bản X của phần mềm Y bị lỗi trong môi trường sản xuất Z, nhà phát triển có thể tạo lại nó một cách trung thực trên máy của họ với sự tự tin rằng họ đang gỡ lỗi điều tương tự.

18
là so sánh của hai hệ thống có sẵn công khai? nếu có, bạn có thể chia sẻ nó?
Carlos Barcelona

43

Vì các liên kết bài viết có xu hướng chết, đây là một bản tóm tắt về quan điểm của Nhóm Gradle về Bazel (hầu hết được lấy trực tiếp từ bài báo, được xuất bản vào tháng 3 năm 2015):

Nó được thiết kế để giải quyết một vấn đề duy nhất cho Google; một codebase nguyên khối khổng lồ (hàng trăm triệu LỘC).

Lợi thế song song mà Bazel hiện cung cấp sẽ được khớp với "mô hình thành phần và cấu hình mới sắp tới của chúng tôi" (ghi nhớ ngày viết bài ở đây).

Bazel không có ngôn ngữ xây dựng khai báo cấp cao giúp việc xây dựng dễ sử dụng cho các nhà phát triển. Tại Google, điều này có thể được bù đắp với một nhóm dịch vụ chuyên biệt sở hữu công cụ xây dựng.

Bazel không được xây dựng để mở rộng (mặc dù nhóm phát triển của Bazel đã chống lại điều này với sự đảm bảo rằng họ đang làm việc trên khả năng mở rộng).

Tốc độ được tối ưu hóa xung quanh ý tưởng rằng tất cả các phụ thuộc bắc cầu được lưu trữ trong một repo lớn; tất cả các thư viện và công cụ được kiểm tra trong kho lưu trữ trung tâm này. Hầu hết các doanh nghiệp có nhiều yêu cầu quản lý phụ thuộc phân phối.

Bazel chỉ * nix, nó không chạy trên Windows. Điều này giúp loại bỏ một số lượng lớn các doanh nghiệp tiềm năng.

Không có hệ sinh thái plugin.


17
Là một bản cập nhật cho câu trả lời này, lưu ý rằng: 1. Bazel đã cải thiện rất nhiều về khả năng mở rộng (nhiều ngôn ngữ mới hiện được hỗ trợ nhờ cộng đồng), 2. có phiên bản Windows thử nghiệm ( bazel.build/versions/master/docs/ cửa sổ.html ). Hỗ trợ Windows sẽ cải thiện rất nhiều trong năm nay.
Laurent

3
Câu trả lời này không chính xác. Bazel có thể mở rộng thông qua một ngôn ngữ cấp cao có tên Starlark, rất giống với Python. Có một hệ sinh thái của các plugin. Bazel hoạt động trên Windows. Bazel không yêu cầu một mono-repo.
sdgfsdh

2
"Mô hình cấu hình và thành phần mới sắp tới của chúng tôi" chưa từng xảy ra. Họ dường như đã xóa bất kỳ liên kết đến đó trong bài viết của Gradle. Nhưng vào năm 2014, có lẽ họ đã nói về "cấu hình mô hình dựa trên quy tắc" hiện không được chấp nhận . Thí nghiệm nhỏ đó khiến Gradle tốn kém rất nhiều vì nó gần như chia đôi cộng đồng.
Renato

1

Gradle chủ yếu được sử dụng trong hệ sinh thái JVM (Java, Ggroovy, Scala, Kotlin ...). Nếu dự án của bạn nằm trong lĩnh vực này và bạn phải đặt câu hỏi, Gradle hoặc Maven sẽ là lựa chọn tốt hơn. Để khắc phục sự cố bản dựng Gradle, bạn sẽ chỉ sử dụng hệ sinh thái Java và JVM.

Bazel at heart có khả năng phát hiện các thay đổi gia tăng (cũng như bộ đệm xây dựng phân tán) và cho phép bạn phản ứng, áp dụng các plugin / quy tắc để đạt được các bản dựng tăng dần. Để thiết lập và duy trì điều này cần một chút kiến ​​thức về CPP, Java và Python (Skylark) và kiến ​​thức của Quản trị viên hệ thống. Một lần nữa nếu bạn phải đặt câu hỏi tôi nghĩ Gradle hoặc Maven sẽ là một khoản đầu tư rẻ hơn. Với Bazel, bạn có thể xây dựng bất kỳ ngôn ngữ nào, theo cách bạn xác định, nhiều sức mạnh hơn, nhưng với chi phí.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.