Bazel ve Gradle arasındaki farklar nelerdir?


Yanıtlar:


172

Feragatname: Bazel üzerinde çalışıyorum ve Gradle'ı yakından tanımıyorum. Ancak, iş arkadaşlarımdan biri, burada yorumlayacağım iki sistemin bir karşılaştırmasını yazdı:

Bazel ve Gradle, yapım deneyiminin farklı yönlerini vurgular. Bir dereceye kadar, öncelikleri uyumsuz - Gradle'ın esneklik ve rahatsız edici olmama arzusu, yapı yapısına getirebileceği kısıtlamaları sınırlarken, Bazel'in güvenilirlik ve performans arzusu mutlaka pazarlık edilemez kısıtlamaları zorlar.

Gradle, Bazel'in yaptığı ilkelere değer verir, yani Gradle ekibi performansa (artımlı yapılar, paralel yapılandırma ve yürütme, Gradle daemon), doğruluk (içeriğe dayalı “güncel” kontrol) ve tekrarlanabilirliğe büyük önem verir (bildirici sözdizimi, bağımlı sürüm oluşturma, açıkça bildirilen bağımlılıklar için zengin destek). Bazel, esnek proje düzenlerine duyulan ihtiyaca saygı duyuyor.

Nüans, Gradle'ın iyi uygulamayı teşvik etmek isterken Bazel bunu istemektedir. Gradle, Ant deneyimi (kendi proje yapınızı tutarsız sonuçlarla tanımlama özgürlüğü) ve Maven deneyimi (değişen proje ihtiyaçlarına yer bırakmayan zorunlu en iyi uygulamalar) arasında bir orta noktayı hedefler. Bazel, güçlü iş akışlarını sağlayan güçlü garantilerden ödün vermeden esnek proje desteğinin mümkün olduğuna inanıyor.

Her iki felsefe de daha “doğru” değildir; bir projeye en uygun araç hangisi o projenin değerlerine bağlıdır.

Gradle Genel Bakış

Gradle, kullanıcıların projelerini nasıl düzenledikleri konusunda minimum kısıtlamayla eksiksiz ve güvenilir yapı akışları oluşturmalarını kolaylaştıran oldukça esnek bir sistemdir. Bunu, kullanıcıların istediği şekilde bu blokları birleştirebilen genel, Turing-complete, komut dosyası arabirimi ile güçlü yapı blokları (örn. Otomatik bağımlılık izleme ve alma, sıkıca entegre eklenti desteği) sağlayarak yapar.

Gradle aşağıdaki özellikleri vurgular:

  • Diğer sistemlerden kolay taşıma. Gradle, rastgele iş akışı yapılarını kolayca uygulamak için herhangi bir proje organizasyonunu kolayca barındırır. Ant görevlerini doğal olarak anlar ve Maven ve Ivy depolarıyla yerel olarak bütünleşir.
  • Son derece genişletilebilir komut dosyası oluşturma modeli. Kullanıcılar Groovy komut dosyaları yazarak tüm yapı mantığını uygularlar. Bir "derleme", temelde açık uçlu, geçersiz kılınabilen, genişletilebilir yöntem tanımları olan genel görevlerin bağımlılık sıralı bir yürütmesidir.
  • Zengin bağımlılık yönetimi. Sürümlendirilmiş bağımlılıklar harici kod depolarından, yerel dosya sistemlerinden ve diğer Gradle projelerinden bildirilebilir ve otomatik olarak hazırlanabilir. Yapı çıktıları da havuzlara ve diğer konumlara otomatik olarak yayınlanabilir.
  • Sıkı entegre eklenti sistemi. Eklentiler, istenen iş akışını kolaylaştırmak için düzenlenmiş görevler grubudur. Gradle'ın "temel" özelliklerinin çoğu aslında eklentiler (örn. Java, Android) aracılığıyla uygulanır. Eklentiler, derleme komut dosyası mantığıyla sıkıca etkileşime girer (kendi takdirine bağlı olarak). Eklentiler Gradle'ın temel veri yapılarına derinlemesine erişimin tadını çıkarır.

Bazel Genel Bakış

Bazel, dahili Google projelerini güvenilir ve verimli bir şekilde oluşturma ihtiyacından çıktı. Google'ın geliştirme ortamı alışılmadık derecede geniş ve karmaşık olduğu için Bazel, yapılarının bütünlüğü ve bunları gerçekleştirirken alışılmadık derecede düşük performans yükü hakkında alışılmadık derecede güçlü garantiler sunar.

Bu, bir “derleme” referans verilebilen, tekrarlanabilen, farklı makinelere aktarılabilen ve her örneğin bilindiği şekilde keyfi programlara ve hizmetlere geçirilebilen soyut bir varlık haline gelen tekrarlanabilir yapıların etrafında inşa edilmiş güçlü geliştirme iş akışları için bir temel sağlar. tam olarak aynı.

Bazel aşağıdaki özellikleri vurgular:

  • Doğruluk. Bazel yapıları her zaman doğru çıktı, dönem üretmek üzere tasarlanmıştır. İki kullanıcı aynı yapıyı farklı makinelerde aynı Bazel bayrakları ile aynı taahhütte çağırırsa, aynı sonuçları görürler. Artımlı yapılar, temiz yapılar kadar güvenilir bir şekilde doğrudur ve ikincisi esasen gereksizdir.
  • Verim. Yapılar, kendilerine sunulan kaynaklar göz önüne alındığında, mümkün olduğunca hızlı yürütülecek şekilde tasarlanmıştır. Görevler, bağımlılık zincirlerinin izin verdiği ölçüde paralelleştirilebilir. Gereksiz çalışma asla yapılmaz (yani “güncel” görevler her zaman atlanır). Yerel makine sınırlarının üstesinden gelmek için doğal olarak uzak idarecilere çalışma yapılabilir.
  • Yeniden üretilebilirlik. Bir yapının herhangi bir örneği, her ortamda sadakatle çoğaltılabilir. Örneğin, bir hata raporu Y yazılımının X sürümünün üretim ortamı Z'de başarısız olduğunu söylüyorsa, bir geliştirici aynı şeyi hata ayıkladıklarından emin olarak kendi makinelerinde sadakatle yeniden oluşturabilir.

18
iki sistemin karşılaştırması kamuya açık mı? evet ise, paylaşır mısın?
Carlos Barcelona

44

Makale bağlantıları ölme eğiliminde olduğundan , Gradle Team'in Bazel hakkındaki görüşlerinin bir özeti (çoğu doğrudan Mart 2015'te yayınlanan makaleden kaldırılmaktadır):

Google'a özgü bir sorunu çözmek için tasarlanmıştır; büyük bir monolitik kod tabanı (yüz milyonlarca LOC).

Bazel'in şu anda sağladığı paralellik avantajı "yaklaşmakta olan yeni konfigürasyon ve bileşen modelimiz" ile eşleştirilecek (buradaki makale tarihini aklınızda bulundurun).

Bazel, yapının geliştiriciler için kullanımını kolaylaştıran yüksek düzeyde beyan edici bir yapı diline sahip değildir. Google'da bu, oluşturma aracına sahip olan özel bir hizmet ekibi ile telafi edilebilir.

Bazel genişletilebilirlik için tasarlanmamıştır (ancak Bazel geliştirme ekibi bunu genişletilebilirlik üzerinde çalıştıklarına dair güvence ile karşılamış olsa da).

Hız, tüm geçişli bağımlılıkların büyük bir depoda saklandığı fikri etrafında optimize edilmiştir; tüm kütüphaneler ve araçlar bu merkezi depoda kontrol edilir. Çoğu İşletmenin daha fazla dağıtılmış bağımlılık yönetimi gereksinimleri vardır.

Bazel sadece * nix'tir, Windows üzerinde çalışmaz. Bu, çok sayıda potansiyel İşletmeyi ortadan kaldırır.

Eklenti ekosistemi yok.


17
Bu cevap için bir güncelleme olarak şunu unutmayın: 1. Bazel, genişletilebilirlik konusunda çok gelişti (artık topluluk sayesinde birçok yeni dil destekleniyor), 2. Deneysel bir Windows sürümü var ( bazel.build/versions/master/docs/ windows.html ). Windows desteği bu yıl çok gelişmeli.
Laurent

3
Bu cevap doğru değil. Bazel, Python'a çok benzeyen, Starlark adlı üst düzey bir dil ile genişletilebilir. Bir eklenti ekosistemi var. Bazel Windows üzerinde çalışıyor. Bazel mono repo gerektirmez.
sdgfsdh

2
"Yeni yapılandırma ve bileşen modelimiz" hiç olmadı. Gradle'ın makalesinde bununla ilgili bağlantıları silmiş görünüyorlar. Ancak 2014'te muhtemelen şu anda kullanımdan kaldırılmış olan "kural tabanlı model yapılandırması" ndan bahsediyorlardı . Bu küçük denemenin maliyeti, Gradle'ı topluluğa neredeyse ikiye böldüğü için çok pahalıya mal oldu.
Renato

1

Kepçe çoğunlukla JVM eko sisteminde (Java, Ggroovy, Scala, Kotlin ...) kullanılır. Projeniz bu alandaysa ve soruyu sormanız gerekiyorsa, Gradle veya Maven daha iyi bir seçim olacaktır. Bir Gradle derlemesinde sorun gidermek için yalnızca Java ve JVM ekosistemiyle mücadele edeceksiniz.

Kalpteki Bazel, artımlı değişiklikleri (ve dağıtılmış derleme önbelleğinin) algılama yeteneğine sahiptir ve artımlı derlemeler elde etmek için tepki vermenize, eklentiler / kurallar uygulamanıza izin verir. Bunu ayarlamak ve sürdürmek için CPP, Java ve Python (Skylark) ve Sistem Yöneticisi'nin bilgisinde de biraz bilgi gerekiyordu. Yine soru sormak zorunda kalırsanız Gradle veya Maven daha ucuz bir yatırım olacağını düşünüyorum. Bazel ile hangi dili, hangi şekilde tanımlarsanız, daha fazla güç, ancak bir maliyetle inşa edebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.