Gradle Wrapper neden VCS'ye bağlı olmalıdır?


148

Gradle'ın belgelerinden: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html

Bu görev tarafından oluşturulan komut dosyalarının sürüm kontrol sisteminize bağlı olması amaçlanmıştır. Bu görev ayrıca VCS'nize de işlenmesi gereken küçük bir gradle-wrapper.jar bootstrap JAR dosyası ve özellikler dosyası oluşturur. Senaryolar bu JAR'a delege eder.

Kaynak: Ne kaynak kontrolü altında OLMAMALIDIR?

Bence VCS'de Generated filesolmamalı.

Ne zaman gradlewve gradle/gradle-wrapper.jarihtiyaç duyulur?

Neden bir depolamak gradle versioniçinde build.gradledosyaya?


1
Aşağıdaki yanıtlar göz önüne alındığında ilginç bir yan tartışma olabilir, bir tür sürekli entegrasyon aracı kullanıyorsanız, bu dosyaların kullanışlılığıdır. Hangileri sınıf sargısını kontrol edecek ve varsa kullanacak?
lilbyrdie

Yanıtlar:


124

Gradle sargısının tüm noktası, hiç gradle yüklemeden ve hatta nasıl çalıştığını bilmeden, projeyi VCS'den klonlamak için nereden indirileceğini bilmeden, gradlew komut dosyasını yürütmek için içerir ve herhangi bir ek adım olmadan projeyi oluşturmak için.

Tüm sahip olduğunuz bir build.gradle dosyasında bir sürüm numarası olsaydı, X sürümünün X sürümünün Y URL'sinden indirilmesi ve yüklenmesi gerektiğini herkese açıklayan bir README'ye ihtiyacınız olacak ve sürüm her artırıldığında bunu yapmanız gerekecektir.


94
Bu aptalca. gradle-wrapper.jar VCS'de gerekli olmamalıdır. Gradle, gerekirse bir ilk sürümü yükledikten sonra herhangi bir sürümü indirebilmelidir. Alet zincirinin bir VCS'de hiçbir etkisi yoktur… Cevabınızın doğru olduğunu anlıyorum ve Gradle'ın tasarımı. Ancak bu tasarım saçma.
Marc Plano-Lesay

26
Buradaki nokta, daha önce gradle yüklemeden gradle'ı indirebilmektir . VCS'de 50 KB büyüklüğünde bir dosyaya sahip olmanın sorunu nedir?
JB Nizet

59
Sorun şu ki, projenin bir parçası değil. Projeyi oluşturmak için kullandığınız bir araç. JDK'yı VCS'de saklamayacaksınız, değil mi? Ne C uygulaması için GCC? Öyleyse neden bir Gradle parçasını saklıyorsunuz? Bir geliştirici Gradle'ın kendisini okuyamaz ve yükleyemezse, bu başka bir sorundur.
Marc Plano-Lesay

26
Sorun ayrıca, yayınlanmasından 2 yıl sonra, yazılımınızın v1.0 sürümünü oluşturmak için hangi Gradle sürümünün kullanıldığını, hala bu 1.0'ı kullanan bir müşteri için düzeltmeniz gerektiğini hatırlayamamanızdır. sürüm ve yükseltme olamaz. Gradle sarıcı bunu çözer: 1.0 etiketini VCS'den klonlar, gradlew kullanarak oluşturur ve 2 yıl önce 1.0 sürümünü oluşturmak için kullanılan gradle sürümünü kullanır.
JB Nizet

33
Kullanılacak Gradle versiyonunun projenin herhangi bir yerinde belirtilmesi gerektiğini kabul ediyorum. Ancak Gradle harici bir araçtır, README veya listelediğiniz herhangi bir şeyle karşılaştırılamaz. Gradle, VCS'de bir kavanoz saklamak zorunda kalmadan ilgili sürümün kendisini getirebilmelidir.
Marc Plano-Lesay

80

Çünkü kepçe sargısının bütün noktası, kepçeyi monte etmeden mümkün olacak

Aynı argüman JDK için de geçerli, bunu da yapmak istiyor musunuz? Tüm bağımlı kitaplıklarınızı da taahhüt ediyor musunuz?

Yeni sürümler çıktıkça bağımlılıklar sürekli olarak yükseltilmelidir. Güvenlik ve diğer hata düzeltmelerini almak için. Çünkü çok geride kalırsanız, tekrar güncel olmak çok zaman alan bir iş olabilir.

Kepçe sarıcı her yeni sürüm için artırılırsa ve taahhüt edilirse, repo çok büyür. Bir klonun her şeyin tüm sürümlerini indireceği dağıtılmış VCS ile çalışırken sorun açıktır.

ve nasıl çalıştığını bile bilmeden

Sarıcıyı indiren ve oluşturmak için kullanan bir oluşturma komut dosyası oluşturun. Herkes betiğin nasıl çalıştığını bilmek zorunda değildir, projenin yürütülerek oluşturulduğunu kabul etmelidir.

, nereden indirileceği, hangi sürüm

task wrapper(type: Wrapper) {
 gradleVersion = 'X.X' 
}

Ve sonra

gradle wrapper

Doğru sürümü indirmek için.

, projeyi VCS'den klonlamak, içerdiği gradlew betiğini çalıştırmak ve herhangi bir ek adım olmadan projeyi oluşturmak için.

Yukarıdaki adımlarla çözüldü. Gradle sarıcısını indirmek, diğer bağımlılıkları indirmekten farklı değildir. Komut dosyası, geçerli herhangi bir sınıflayıcı paketini kontrol etmek ve yalnızca yeni bir sürüm varsa indirmek için akıllı olabilir.

Geliştirici Gradle'ı daha önce hiç kullanmadıysa ve belki de projenin Gradle ile oluşturulduğunu bilmiyorsa. Sonra "gradlew build" çalışan ile karşılaştırıldığında bir "build.sh" çalıştırmak daha açıktır.

Sahip olduğunuz tek şey bir build.gradle dosyasında bir sürüm sürüm numarası olsaydı, sürüm 2'nin yüklenen URL URL'sinden indirilmesi gereken herkesi açıklayan bir README'ye ihtiyacınız olacaktır.

Hayır, bir README'ye ihtiyacınız olmaz. Bir tane olabilir, ama biz geliştiriciyiz ve mümkün olduğunca otomatik hale getirmeliyiz. Senaryo oluşturmak daha iyidir.

ve sürüm her artırıldığında bunu yapmanız gerekir.

Geliştiriciler doğru sürecin:

  1. Klon repo
  2. Derleme komut dosyasını çalıştır

O zaman en son kepçe sarıcısına yükseltme yapmak sorun değil. Sürüm son çalıştırmadan bu yana artırılırsa, komut dosyası yeni sürümü indirebilir.


2
"Bağımlılıklar sürekli olarak yükseltilmelidir." Evet, ileriye dönük bir yönde. Hayır, geriye doğru bakıyor. Eski bir derlemeyi yeniden oluşturmak için bağımlılıkların belirli sürümlerine sahip olmanız gerekir. Gradle, bazı proje türlerini daha hızlı ve başa çıkmayı kolaylaştırır. Yeniden üretim ve denetime ihtiyaç duyan bir organizasyonda karmaşa olurdu.
lilbyrdie

3
Ne demek istediğinden emin değilim. Ancak build.gradlesürüm kontrolüne sahipseniz ve içinde varsa: task wrapper(type: Wrapper) { gradleVersion = 'X.X' } O gradle wrapperzaman kullanılan sarıcıyı indirecek ve eski yapıyı yeniden üretebilirsiniz.
Tomas Bjerre

1
Sıra sürümüne değil, bağımlılıklara ilişkin çizginize atıfta bulunuyordunuz. Elbette, kütüphanelerinizin en son güvenlik ve hata düzeltmelerine sahip olmasını istiyorsunuz, ancak eski bir derlemeyi yeniden oluşturmaya çalışırken, belki de denetim veya yasal amaçlarla değil. Mümkünse, kitaplıklarınızın ve derleme işleminizin ikili bir özdeş çıktı üretebilmesini istiyorsunuz. Kütüphane bağımlılığında olduğu gibi, bina sırasında belirli bir versiyonun mevcut olacağının garantisi yoktur ... 2 hafta veya 2 yıl sonra olsun. Evet, bazı projeler için kütüphaneler ve SDK'larla aynı.
lilbyrdie

3
Ben sarıcı öncelikle tarihi bir nedenden dolayı orada olduğunu düşünüyorum. Başlangıçta herkes Maven kullanıyor ve kimse Gradle yüklü değil. İş arkadaşınızı bilinmeyen müdahaleci bağımlılıkları yüklemeye ikna etmek zor olacaktır, bu nedenle sarıcı onlara önyükleme yapmasına yardımcı olur. Günümüzde herkes zaten Gradle'a sahip ve sargı gereksiz hale geliyor.
Franklin Yu

1
gradle wrapperHer yapıda klondan sonra çalıştırmayı mı öneriyorsun ? Bu temelde sargıyı işe yaramaz hale getirir, çünkü tüm mesele, projeyi oluşturmak için Gradle'ı yerel olarak yüklemenize gerek yoktur !
Xerus

41

Basit bir yaklaşım önermek istiyorum.

Projenizin README'sinde, bir kurulum adımının gerekli olduğunu, yani:

gradle wrapper --gradle-version 3.3

Bu Gradle 2.4 veya üstü ile çalışır. Bu, "build.gradle" öğesine özel bir görev eklenmesine gerek kalmadan bir sarıcı oluşturur.

Bu seçenekle, sürüm kontrolü için bu dosyaları / klasörleri yok sayın (teslim etmeyin):

  • ./gradle
  • gradlew
  • gradlew.bat

En önemli faydası, kaynak kontrolü için indirilen bir dosyayı iade etmek zorunda olmamanızdır. Kurulum için bir adım daha atar. Bence buna değer.


15
neden sargıya ihtiyacınız var? Sarma fikrinin tamamı, sisteminizde gradle olmadan proje oluşturabilmenizdir.
edio

4
Güzel çözüm. Git içinde hiçbir ikili ve hala kullanma yeteneği gradlew. @ edio, belirli bir sürüm sürümünü indirmek ve kullanmak için buna ihtiyacınız olacaktır .
Kirill

3

"Proje" nedir?

Belki bu deyimin derleme derlemelerini hariç tutan teknik bir tanımı vardır. Ancak bu tanımı kabul edersek, "projenizin" sürümlendirmeniz gereken her şey olmadığını söylemeliyiz!

Ama biz "projenizi" derseniz olduğunu herşey sen yaptın . O zaman onu sadece VCS'ye dahil etmeniz gerektiğini söyleyebiliriz .

Bu çok teoriktir ve belki de geliştirme çalışmalarımızda pratik olmayabilir. Bu yüzden bunu " projeniz doğrudan düzenlemek için ihtiyacınız olan her dosya (veya klasör) " olarak değiştiriyoruz.

"doğrudan", "dolaylı değil" anlamına gelir ve "dolaylı", başka bir dosyayı düzenleyerek anlamına gelir ve daha sonra bir efekt bu dosyaya yansıtılacaktır .

Böylece OP'nin söylediği ile aynı noktaya geliyoruz (ve burada söyleniyor ):

Oluşturulan dosyaların VCS'de olmaması gerektiğini düşünüyorum.

Evet. Çünkü siz onları yaratmadınız. Yani ikinci tanıma göre "projenizin" bir parçası değiller.


Bu dosyalar ile ilgili sonuç nedir:

  • build.gradle : Evet. Bunu düzenlemeliyiz. Çalışmalarımız sürümlendirilmelidir.

    Not: Düzenlediğiniz yerde bir fark yoktur. Metin düzenleyici ortamınızda veya Proje Yapısı GUI ortamında. Neyse sen bunu yaparken doğrudan !

  • gradle-wrapper.properties : Evet. En azından bu dosyadaki Gradle sürümünü belirlememiz gerekiyor.

  • gradle-wrapper.jar ve gradlew [.bat] : Şu ana kadar geliştirme çalışmalarımın hiçbirinde onları oluşturmadım veya düzenlemedim! Dolayısıyla yanıt hayır". Bunu yaptıysanız, cevap bu işte sizinle (ve düzenlediğiniz dosyayla ilgili) "Evet" olur.


Son olayda hakkında önemli not da repo klonlar kullanıcı, bu komut çalıştırmak gerekiyor ise repo en<root-directory> etmek -üretmek oto dosyaları sarıcı:

> gradle wrapper --gradle-version=$v --distribution-type=$distType

$vve kepçe- sarıcıdan$distType belirlenir. özellikleri :

distributionUrl=https\://services.gradle.org/distributions/gradle-{$v}-{$distType}.zip

Daha fazla bilgi için https://gradle.org/install/ adresine bakın .

gradleyürütülebilir bin/gradle[.bat]yerel dağıtımda. Yerel dağıtımın repoda belirtilenle aynı olması gerekmez. Sonra sarıcı dosyalar daha sonra oluşturulan gradlew[.bat](değil yerel varsa) otomatik olarak Gradle dağılımı belirlenebilir indirebilirsiniz. Daha sonra muhtemelen gradleyukarıdaki talimatları kullanarak yeni yürütülebilir (indirilen dağıtımda) kullanarak sarıcı dosyalarını yeniden oluşturmalıdır .


Not: Yukarıdaki talimatlarda, kullanıcının yerel olarak en az bir Gradle dağıtımına sahip olduğu varsayılmıştır (örn. ~/.gradle/wrapper/dists/gradle-4.10-bin/bg6py687nqv2mbe6e1hdtk57h/gradle-4.10). Neredeyse tüm gerçek vakaları kapsar. Ancak , kullanıcının zaten dağıtımı yoksa ne olur?

.propertiesDosyadaki URL'yi kullanarak manuel olarak indirebilir . Ancak, sargının beklediği yolda bulamazsa , sarıcı tekrar indirir! Beklenen yol tamamen tahmin edilebilir, ancak konu dışındadır ( en karmaşık kısım için buraya bakın ).

Bazı daha kolay (ama kirli) yollar da vardır. Örneğin, sarma dosyalarını ( .propertiesdosya hariç ) diğer herhangi bir yerel / uzak depodan deposuna kopyalayabilir ve daha sonra deposunda çalıştırabilir gradlew. Uygun dağıtımı otomatik olarak indirecektir.


1

Göre Gradle docs , ekleme gradle-wrapper.jarVCS edilir beklenen geliştiriciler için kullanılabilir Gradle Sarıcı Gradle yaklaşımının bir parçasıdır yapma gibi:

Wrapper dosyalarını diğer geliştiriciler ve yürütme ortamları için kullanılabilir hale getirmek için bunları sürüm denetiminde kontrol etmeniz gerekir. JAR dosyası da dahil olmak üzere tüm Wrapper dosyalarının boyutları çok küçüktür. Sürüm denetimine JAR dosyası eklenmesi bekleniyor. Bazı kuruluşlar, projelerin sürüm denetimine ikili dosyalar göndermesine izin vermez. Şu anda yaklaşım için alternatif bir seçenek yok.


1

Eski soru, yeni cevap. Gradle'ı sık sık yükseltmezseniz (çoğumuz yükseltmeziz), VCS'ye taahhüt etmek daha iyidir. Ve benim için ana sebep CI sunucusundaki inşa hızını artırmak. Günümüzde projelerin çoğu, her seferinde farklı sunucu örnekleri olan CI sunucuları tarafından kuruluyor ve kuruluyor.

Taahhüt etmezseniz, CI sunucusu her derleme için bir kavanoz indirir ve derleme süresini önemli ölçüde artırır. Bu sorunu ele almanın başka yolları da var, ama bunu en kolayı buluyorum.

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.