Apa perbedaan antara Bazel dan Gradle?

145

Google baru saja membuka sumbernya untuk membangun alat Bazel . Apa perbedaan antara alat ini dan Gradle ? Apa yang bisa dilakukan Gradle yang tidak bisa, apa yang dilakukannya lebih baik, dan apa yang dilakukan Gradle lebih baik?

pengguna11171
sumber

Jawaban:

171

Penafian: Saya bekerja di Bazel dan saya tidak akrab dengan Gradle. Namun, salah satu rekan kerja saya menulis perbandingan dari dua sistem, yang akan saya uraikan di sini:

Bazel dan Gradle menekankan berbagai aspek dari pengalaman membangun. Dalam batas tertentu, prioritas mereka tidak sesuai - keinginan Gradle untuk fleksibilitas dan non-obtrusif membatasi pembatasan yang dapat ditempatkan pada struktur bangunan, sementara keinginan Bazel untuk keandalan dan kinerja tentu saja memberlakukan pembatasan yang tidak dapat dinegosiasikan.

Gradle menghargai prinsip-prinsip yang sama seperti yang dilakukan Bazel, yaitu tim Gradle menaruh perhatian besar pada kinerja (peningkatan bertahap, konfigurasi dan eksekusi paralel, daemon Gradle), kebenaran (pengecekan berbasis konten "terkini"), dan reproduktifitas (dukungan kaya untuk sintaksis deklaratif, versi dependensi, dependensi yang dinyatakan secara eksplisit). Dan Bazel menghormati kebutuhan tata letak proyek yang fleksibel.

Nuansa itu adalah bahwa Gradle ingin mempromosikan praktik yang baik sementara Bazel ingin mewajibkannya. Gradle bertujuan untuk jalan tengah antara pengalaman Semut (kebebasan untuk menentukan struktur proyek Anda sendiri dengan hasil yang tidak jelas) dan pengalaman Maven (praktik terbaik yang diterapkan tanpa ruang untuk beragam kebutuhan proyek). Bazel percaya bahwa dukungan proyek yang fleksibel dimungkinkan tanpa mengorbankan jaminan kuat yang memungkinkan alur kerjanya yang kuat.

Tidak ada filosofi yang lebih “benar” - alat mana pun yang paling sesuai dengan proyek tergantung pada nilai-nilai proyek tertentu.

Ikhtisar Gradle

Gradle adalah sistem yang sangat fleksibel yang memudahkan pengguna untuk membangun aliran pembangunan yang lengkap dan andal dengan kendala minimal tentang cara mereka mengatur proyek mereka. Ini dilakukan dengan memasok blok bangunan yang kuat (mis. Pelacakan dan pengambilan dependensi otomatis, dukungan plugin terintegrasi ketat) dengan antarmuka skrip generik, lengkap 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 setiap organisasi proyek untuk dengan mudah menerapkan struktur alur kerja yang sewenang-wenang. Ini secara alami memahami tugas Ant, dan secara alami terintegrasi dengan repositori Maven dan Ivy.
  • Model skrip yang sangat extensible. Pengguna menerapkan semua logika pembangunan dengan menulis skrip Groovy. “Build” hanyalah eksekusi ketergantungan-urutan dari tugas-tugas generik, yang pada dasarnya adalah definisi metode terbuka, dapat ditimpa, dapat diperluas.
  • Manajemen ketergantungan yang kaya. Ketergantungan versi dapat dideklarasikan dan secara otomatis dipentaskan dari repositori kode eksternal, sistem file lokal, dan proyek Gradle lainnya. Output build juga dapat dipublikasikan secara otomatis ke repositori dan lokasi lain.
  • Sistem plugin terintegrasi sangat ketat. Plugin hanyalah kumpulan tugas yang diorganisasikan untuk memfasilitasi alur kerja yang diinginkan. Banyak fitur "inti" Gradle sebenarnya diimplementasikan melalui plugin (mis. Java, Android). Plugin berinteraksi (sesuai kebijakan mereka) erat dengan membangun skrip logika. Plugin menikmati akses mendalam ke struktur data inti Gradle.

Ikhtisar Bazel

Bazel berevolusi dari kebutuhan untuk membangun proyek-proyek internal Google secara andal dan efisien. Karena lingkungan pengembangan Google luar biasa besar dan kompleks, Bazel menawarkan jaminan yang luar biasa kuat tentang integritas build-nya dan overhead kinerja yang luar biasa rendah dalam mencapainya.

Ini memberikan landasan bagi alur kerja pengembangan yang kuat yang dibangun di sekitar bangunan yang dapat direproduksi, di mana "bangunan" menjadi entitas abstrak yang dapat dirujuk, diulangi, diedarkan ke mesin yang berbeda, dan diteruskan ke program dan layanan sewenang-wenang sehingga setiap instance diketahui dikenal persis sama.

Bazel menekankan fitur-fitur berikut:

  • Ketepatan. Bazel build dirancang untuk selalu menghasilkan output 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 tambahan sama andalnya dengan build bersih, menjadikan yang terakhir pada dasarnya tidak perlu.
  • Performa. Build dirancang untuk mengeksekusi secepat mungkin secara intrinsik mengingat sumber daya yang tersedia untuk mereka. Tugas dapat diparalelkan sebagaimana rantai ketergantungannya memungkinkan. Pekerjaan yang tidak perlu tidak pernah dieksekusi (mis. Tugas "up-to-date" selalu dilewati). Pekerjaan secara alami dapat dialihkan ke pelaksana jarak jauh untuk mengatasi batas alat berat lokal.
  • Reproduksibilitas. Segala contoh bangunan dapat direproduksi dengan setia di lingkungan apa pun. Misalnya, jika laporan bug mengatakan versi X perangkat lunak Y gagal dalam lingkungan produksi Z, pengembang dapat dengan setia membuatnya kembali di mesin mereka sendiri dengan keyakinan bahwa mereka sedang melakukan debug pada hal yang sama.
kristina
sumber
18
Apakah perbandingan kedua sistem tersedia untuk umum? jika ya, bisakah Anda membagikannya?
Carlos Barcelona
43

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

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

Keunggulan parallelisation yang saat ini disediakan Bazel akan dicocokkan dengan "konfigurasi baru kami dan model komponen" (ingat tanggal artikel di sini).

Bazel tidak memiliki bahasa build deklaratif tingkat tinggi yang membuat build mudah digunakan untuk pengembang. Di Google ini dapat dikompensasi dengan tim layanan khusus yang memiliki alat build.

Bazel tidak dibangun untuk diperpanjang (meskipun tim pengembangan Bazel sejak itu membalas ini dengan jaminan bahwa mereka bekerja pada diperpanjang).

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. Ini menghilangkan sejumlah besar Perusahaan potensial.

Tidak ada ekosistem plugin.

RCross
sumber
17
Sebagai pembaruan untuk jawaban ini, perhatikan bahwa: 1. Bazel telah meningkatkan banyak hal tentang ekstensibilitas (banyak bahasa baru sekarang didukung berkat komunitas), 2. ada versi Windows eksperimental ( bazel.build/versions/master/docs/ windows.html ). Dukungan Windows harus meningkat banyak tahun ini.
Laurent
3
Jawaban ini tidak akurat. Bazel dapat dikembangkan melalui bahasa tingkat tinggi yang disebut Starlark, yang sangat mirip dengan Python. Ada ekosistem plugin. Bazel bekerja di Windows. Bazel tidak memerlukan mono-repo.
sdgfsdh
2
"model konfigurasi dan komponen baru kami yang akan datang" yang tidak pernah terjadi. Mereka tampaknya telah menghapus tautan apa pun ke tautan itu di artikel Gradle. Tetapi pada tahun 2014 mereka mungkin berbicara tentang "konfigurasi model berbasis aturan" yang sudah usang sekarang . Percobaan kecil itu membuat Gradle sangat mahal karena hampir membelah komunitas menjadi dua.
Renato
1

Gradle sebagian besar digunakan dalam sistem eco JVM (Java, Ggroovy, Scala, Kotlin ...). Jika proyek Anda ada di area ini, dan Anda harus mengajukan pertanyaan, Gradle atau Maven akan menjadi pilihan yang lebih baik. Untuk memecahkan masalah pembangunan Gradle, Anda hanya akan berkutat dengan ekosistem Java dan JVM.

Bazel di jantung memiliki kemampuan untuk mendeteksi perubahan inkremental (serta cache build terdistribusi) dan memungkinkan Anda untuk bereaksi, menerapkan plugin / aturan untuk mencapai build inkremental. Untuk mengatur dan memelihara ini diperlukan sedikit pengetahuan dalam CPP, Java dan Python (Skylark) dan juga pengetahuan System Admin. Sekali lagi jika Anda harus mengajukan pertanyaan, saya pikir Gradle atau Maven akan menjadi investasi yang lebih murah. Dengan Bazel Anda dapat membangun bahasa apa pun, dengan cara apa pun yang Anda tetapkan, lebih banyak kekuatan, tetapi dengan biaya.

HoaPhan
sumber