Apa perbedaan antara Bazel dan Gradle?

Google baru saja bersumber terbuka alat pembuatannya Bazel. Apa perbedaan antara alat ini dan Gradle? Apa yang bisa dilakukan Gradle yang tidak bisa dilakukan Gradle, apa yang bisa dilakukannya dengan lebih baik, dan apa yang bisa dilakukan Gradle dengan lebih baik?


person user11171    schedule 25.03.2015    source sumber


Jawaban (3)


Penafian: Saya mengerjakan Bazel dan saya tidak terlalu mengenal Gradle. Namun, salah satu rekan kerja saya menulis perbandingan kedua sistem tersebut, yang akan saya parafrasekan di sini:

Bazel dan Gradle menekankan aspek berbeda dari pengalaman membangun. Sampai batas tertentu, prioritas mereka tidak sejalan - keinginan Gradle akan fleksibilitas dan sifat tidak mencolok membatasi batasan yang dapat diterapkan pada struktur bangunan, sementara keinginan Bazel akan keandalan dan kinerja tentu saja menerapkan batasan yang tidak dapat dinegosiasikan.

Gradle menghargai prinsip-prinsip yang sama dengan Bazel, yaitu tim Gradle menaruh perhatian besar pada kinerja (pembangunan inkremental, konfigurasi dan eksekusi paralel, daemon Gradle), kebenaran (pemeriksaan “terkini” berbasis konten), dan reproduktifitas (dukungan yang kaya untuk sintaksis deklaratif, pembuatan versi ketergantungan, ketergantungan yang dideklarasikan secara eksplisit). Dan Bazel menghormati kebutuhan akan tata letak proyek yang fleksibel.

Nuansanya adalah Gradle ingin mempromosikan praktik yang baik sementara Bazel ingin mewajibkannya. Gradle bertujuan untuk menjadi jalan tengah antara pengalaman Ant (kebebasan menentukan struktur proyek Anda sendiri dengan hasil yang tidak koheren) dan pengalaman Maven (praktik terbaik yang diterapkan tanpa ruang untuk berbagai kebutuhan proyek). Bazel percaya bahwa dukungan proyek yang fleksibel dapat dilakukan tanpa mengorbankan jaminan kuat yang memungkinkan alur kerja yang kuat.

Tidak ada filosofi yang lebih “benar” - alat mana pun yang paling sesuai dengan suatu proyek bergantung pada nilai-nilai proyek tersebut.

Ikhtisar Gradle

Gradle adalah sistem yang sangat fleksibel yang memudahkan pengguna membuat alur pembangunan yang lengkap dan andal dengan batasan minimal dalam cara mereka mengatur proyek. Hal ini dilakukan dengan menyediakan blok penyusun yang kuat (misalnya pelacakan dan pengambilan ketergantungan otomatis, dukungan plugin yang terintegrasi erat) dengan antarmuka skrip generik yang lengkap dengan Turing yang dapat menggabungkan blok-blok ini sesuai keinginan pengguna.

Gradle menekankan fitur-fitur berikut:

  • Migrasi yang mudah dari sistem lain. Gradle dengan mudah mengakomodasi organisasi proyek mana pun untuk dengan mudah mengimplementasikan struktur alur kerja yang berubah-ubah. Ia memahami tugas Ant secara asli, dan terintegrasi secara asli dengan repositori Maven dan Ivy.
  • Model skrip yang sangat dapat diperluas. Pengguna mengimplementasikan semua logika build dengan menulis skrip Groovy. Sebuah "build" hanyalah eksekusi tugas-tugas umum yang diurutkan berdasarkan ketergantungan, yang pada dasarnya merupakan definisi metode yang terbuka, dapat diganti, dan dapat diperluas.
  • Manajemen ketergantungan yang kaya. Ketergantungan berversi dapat dideklarasikan dan dipentaskan secara otomatis dari repositori kode eksternal, sistem file lokal, dan proyek Gradle lainnya. Output build juga dapat dipublikasikan secara otomatis ke repositori dan lokasi lainnya.
  • Sistem plugin yang terintegrasi erat. Plugin hanyalah kumpulan tugas yang diatur untuk memfasilitasi alur kerja yang diinginkan. Banyak fitur "inti" Gradle yang sebenarnya diimplementasikan melalui plugin (misalnya Java, Android). Plugin berinteraksi (sesuai kebijaksanaannya) erat dengan logika skrip build. Plugin menikmati akses mendalam ke struktur data inti Gradle.

Ikhtisar Bazel

Bazel berevolusi dari kebutuhan untuk membangun proyek internal Google dengan andal dan efisien. Karena lingkungan pengembangan Google sangat besar dan kompleks, Bazel menawarkan jaminan yang sangat kuat tentang integritas bangunannya dan overhead kinerja yang sangat rendah dalam mencapainya.

Hal ini memberikan landasan bagi alur kerja pengembangan yang kuat yang dibangun berdasarkan build yang dapat direproduksi, di mana “build” menjadi entitas abstrak yang dapat direferensikan, diulang, diteruskan ke mesin berbeda, dan diteruskan ke program dan layanan arbitrer sehingga setiap instance diketahui persis sama.

Bazel menekankan fitur-fitur berikut:

  • Kebenaran. Pembuatan Bazel dirancang untuk selalu menghasilkan keluaran yang benar, titik. Jika dua pengguna memanggil build yang sama pada commit yang sama dengan flag Bazel yang sama pada mesin yang berbeda, mereka akan melihat hasil yang sama. Build inkremental sama benarnya dengan build bersih, sehingga menjadikan build bersih pada dasarnya tidak diperlukan.
  • Performa. Build dirancang untuk dieksekusi secepat mungkin mengingat sumber daya yang tersedia. Tugas dapat diparalelkan sesuai dengan kemampuan rantai ketergantungannya. Pekerjaan yang tidak perlu tidak pernah dilaksanakan (yaitu tugas-tugas “terkini” selalu dilewati). Pekerjaan secara alami dapat diberikan kepada pelaksana jarak jauh untuk mengatasi batasan mesin lokal.
  • Reprodusibilitas. Setiap instance build dapat direproduksi dengan tepat di lingkungan mana pun. Misalnya, jika laporan bug mengatakan versi X perangkat lunak Y gagal di lingkungan produksi Z, pengembang dapat dengan setia membuat ulang perangkat lunak tersebut di mesin mereka sendiri dengan keyakinan bahwa mereka sedang melakukan debug pada hal yang sama.
person kristina    schedule 31.03.2015

Karena tautan artikel cenderung mati, berikut ringkasan pandangan Tim Gradle tentang Bazel (sebagian besar diambil langsung dari artikel yang diterbitkan pada Maret 2015):

Ini dirancang untuk memecahkan masalah unik Google; basis kode monolitik yang sangat besar (ratusan juta LOC).

Keunggulan paralelisasi yang saat ini disediakan Bazel akan diimbangi dengan "konfigurasi dan model komponen baru kami yang akan datang" (ingatlah tanggal artikel di sini).

Bazel tidak memiliki bahasa build deklaratif tingkat tinggi yang membuat build mudah digunakan oleh pengembang. Di Google, hal ini dapat dikompensasikan dengan tim layanan khusus yang memiliki alat pembangunan.

Bazel tidak dibangun untuk ekstensibilitas (walaupun tim pengembangan Bazel telah mengatasi hal ini dengan jaminan bahwa mereka sedang mengerjakan ekstensibilitas).

Kecepatan dioptimalkan berdasarkan gagasan bahwa semua dependensi transitif disimpan dalam satu repo besar; semua perpustakaan dan alat diperiksa ke repositori pusat ini. Sebagian besar Perusahaan memiliki persyaratan manajemen ketergantungan yang lebih terdistribusi.

Bazel hanya *nix, tidak berjalan di Windows. Hal ini menghilangkan sejumlah besar Perusahaan potensial.

Tidak ada ekosistem plugin.

person RCross    schedule 17.05.2016
comment
Sebagai pembaruan untuk jawaban ini, perhatikan bahwa: 1. Bazel telah meningkatkan banyak hal tentang ekstensibilitas (banyak bahasa baru kini didukung berkat komunitas), 2. ada versi Windows eksperimental (bazel.build/versions/master/docs/windows.html). Dukungan Windows akan meningkat pesat tahun ini. - person Laurent; 22.03.2017
comment
Jawaban ini tidak akurat. Bazel dapat diperluas melalui bahasa tingkat tinggi yang disebut Starlark, yang sangat mirip dengan Python. Ada ekosistem plugin. Bazel berfungsi di Windows. Bazel tidak memerlukan mono-repo. - person sdgfsdh; 15.03.2019
comment
konfigurasi dan model komponen baru kami yang akan datang yang tidak pernah terjadi. Mereka tampaknya telah menghapus tautan apa pun ke sana di artikel Gradle. Namun pada tahun 2014 mereka mungkin membicarakan tentang konfigurasi model berbasis aturan yang merupakan tidak digunakan lagi sekarang. Eksperimen kecil itu merugikan Gradle karena hampir membagi komunitas menjadi dua. - person Renato; 22.04.2019

Gradle sebagian besar digunakan dalam ekosistem JVM (Java, Ggroovy, Scala, Kotlin ...). Jika proyek Anda berada di bidang ini, dan Anda harus mengajukan pertanyaan, Gradle atau Maven akan menjadi pilihan yang lebih baik. Untuk memecahkan masalah build Gradle, Anda hanya akan berurusan dengan ekosistem Java dan JVM.

Bazel pada intinya memiliki kemampuan untuk mendeteksi perubahan tambahan (serta cache build terdistribusi) dan memungkinkan Anda bereaksi, menerapkan plugin/aturan untuk mencapai build tambahan. Untuk mengatur dan memelihara ini diperlukan sedikit pengetahuan tentang CPP, Java dan Python (Skylark) dan juga pengetahuan Admin Sistem. Sekali lagi jika Anda harus mengajukan pertanyaan, menurut saya Gradle atau Maven akan menjadi investasi yang lebih murah. Dengan Bazel Anda dapat membangun bahasa apa pun, dengan cara apa pun yang Anda definisikan, dengan lebih banyak kekuatan, namun dengan biaya.

person HoaPhan    schedule 03.11.2019