Z dokumentacji Gradle: https://docs.gradle.org/current/dsl/org.gradle.api.tasks.wrapper.Wrapper.html
Skrypty wygenerowane przez to zadanie mają zostać wprowadzone do systemu kontroli wersji. To zadanie generuje również mały plik JAR bootstrap gradle-wrapper.jar i plik właściwości, które również powinny zostać zapisane w systemie VCS. Skrypty są delegowane do tego pliku JAR.
Od: Czego NIE powinno być pod kontrolą źródła?
Myślę, że Generated files
nie powinno być w VCS.
Kiedy są gradlew
i gradle/gradle-wrapper.jar
potrzebne?
Dlaczego nie zapisać gradle version
w build.gradle
pliku?
version-control
gradle
farmer1992
źródło
źródło
Odpowiedzi:
Ponieważ celem programu gradle wrapper jest możliwość, bez konieczności instalowania gradle i nawet nie wiedząc, jak to działa, skąd go pobrać, z której wersji, sklonować projekt z VCS, wykonać skrypt gradlew to zawiera i skompilować projekt bez dodatkowego kroku.
Gdyby wszystko, co miałeś, to numer wersji gradle w pliku build.gradle, potrzebowałbyś README wyjaśniającego wszystkim, że wersja Gradle X musi zostać pobrana z adresu URL Y i zainstalowana, i musiałbyś to robić za każdym razem, gdy wersja jest zwiększana.
źródło
Ten sam argument dotyczy JDK, czy chcesz to również zatwierdzić? Czy oddajesz również wszystkie swoje biblioteki zależne?
Zależności należy aktualizować w sposób ciągły w miarę wydawania nowych wersji. Aby uzyskać zabezpieczenia i inne poprawki błędów. A ponieważ jeśli zajdziesz daleko w tyle, może to być bardzo czasochłonne zadanie, aby ponownie być na bieżąco.
Jeśli otoka gradle jest zwiększana dla każdej nowej wersji i jest zatwierdzona, repozytorium będzie bardzo duże. Problem jest oczywisty podczas pracy z rozproszonym systemem VCS, w którym klon pobierze wszystkie wersje wszystkiego.
Utwórz skrypt kompilacji, który pobiera opakowanie i używa go do kompilacji. Nie każdy musi wiedzieć, jak działa skrypt, musi zgodzić się, że projekt buduje się poprzez jego wykonanie.
I wtedy
Aby pobrać odpowiednią wersję.
Rozwiązany przez powyższe kroki. Pobieranie opakowania gradle nie różni się od pobierania jakichkolwiek innych zależności. Skrypt może być sprytny, aby sprawdzić, czy nie ma żadnego aktualnego opakowania gradle i pobrać go tylko wtedy, gdy jest nowa wersja.
Jeśli programista nigdy wcześniej nie korzystał z Gradle i być może nie wiedząc, że projekt jest budowany za pomocą Gradle. Wtedy bardziej oczywiste jest uruchomienie pliku „build.sh” w porównaniu z uruchomieniem „gradlew build”.
Nie, nie potrzebujesz pliku README. Możesz go mieć, ale my jesteśmy programistami i powinniśmy automatyzować jak najwięcej. Tworzenie skryptu jest lepsze.
Jeśli programiści zgodzą się, że prawidłowy proces to:
Wtedy uaktualnienie do najnowszej owijarki gradle nie stanowi problemu. Jeśli wersja została zwiększona od ostatniego uruchomienia, skrypt może pobrać nową wersję.
źródło
build.gradle
kontrolę wersji i masz w niej:task wrapper(type: Wrapper) { gradleVersion = 'X.X' }
Następniegradle wrapper
pobierzesz opakowanie, które było używane, i będziesz mógł odtworzyć starą wersję .gradle wrapper
po sklonowaniu na każdej kompilacji? Zasadniczo sprawia to, że opakowanie jest bezużyteczne, ponieważ chodzi o to, że nie trzeba lokalnie instalować Gradle, aby zbudować projekt !Chciałbym polecić proste podejście.
W pliku README projektu udokumentuj, że wymagany jest etap instalacji, a mianowicie:
Działa to z Gradle 2.4 lub nowszym. Tworzy to opakowanie bez konieczności dodawania dedykowanego zadania do pliku „build.gradle”.
Dzięki tej opcji zignoruj (nie wpisuj) te pliki / foldery w celu kontroli wersji:
Główną korzyścią jest to, że nie musisz wpisywać pobranego pliku do kontroli źródła. Instalacja kosztuje jeden dodatkowy krok. Myślę, że warto.
źródło
gradlew
. @edio będzie potrzebny do pobrania i używania określonej wersji gradle.Co to jest „projekt”?
Może istnieje techniczna definicja tego idiomu, która wyklucza skrypty budowania. Ale jeśli zaakceptujemy tę definicję, to musimy powiedzieć, że twój „projekt” to nie wszystko, co musisz wersjonować!
Ale jeśli powiemy „Twój projekt”, to wszystko , co zrobiłeś . Wtedy możemy powiedzieć, że musisz to włączyć i tylko to do VCS.
Jest to bardzo teoretyczne i może nie praktyczne w przypadku naszych prac rozwojowych. Więc zmieniamy to na „ Twój projekt to każdy plik (lub folder), który musisz edytować bezpośrednio ”.
„bezpośrednio” oznacza „nie pośrednio”, a „pośrednio” oznacza edycję innego pliku, a efekt zostanie odzwierciedlony w tym pliku .
Więc dochodzimy do tego samego, co powiedział OP (i jest tutaj powiedziane ):
Tak. Bo ty nie stworzył ich. Nie są więc częścią „Twojego projektu” zgodnie z drugą definicją.
Jaki jest wynik w przypadku tych plików:
build.gradle : Tak. Musimy to edytować. Nasze prace powinny być wersjonowane.
Uwaga: nie ma różnicy, gdzie go edytujesz. Czy to w środowisku edytora tekstu, czy w środowisku GUI struktury projektu . Zresztą pan robi to bezpośrednio !
gradle-wrapper.properties : Tak. Musimy przynajmniej określić wersję Gradle w tym pliku.
gradle-wrapper.jar i gradlew [.bat] : Do tej pory nie tworzyłem ani nie edytowałem ich w żadnej z moich prac rozwojowych! Tak więc odpowiedź brzmi „nie”. Jeśli to zrobiłeś, odpowiedź brzmi „Tak”, jeśli chodzi o Ciebie w tej pracy (i ten sam plik, który edytowałeś).
Ważna uwaga o najnowszych przypadku jest użytkownik, który klonuje swoje repo, musi wykonać to polecenie na repo
<root-directory>
do automatycznego generowania otoki pliki:$v
i$distType
są określane na podstawie gradle-wrapper.properties :Więcej informacji można znaleźć pod adresem https://gradle.org/install/ .
gradle
plik wykonywalny jestbin/gradle[.bat]
w dystrybucji lokalnej. Nie jest wymagane, aby dystrybucja lokalna była taka sama, jak określona w repozytorium. Po utworzeniu plików opakowującychgradlew[.bat]
można automatycznie pobrać określoną dystrybucję Gradle (jeśli nie istnieje lokalnie). Następnie prawdopodobnie musi zregenerować pliki opakowujące przy użyciu nowegogradle
pliku wykonywalnego (w pobranej dystrybucji) zgodnie z powyższymi instrukcjami.Uwaga: w powyższych instrukcjach założono, że użytkownik ma lokalnie przynajmniej jedną dystrybucję Gradle (np
~/.gradle/wrapper/dists/gradle-4.10-bin/bg6py687nqv2mbe6e1hdtk57h/gradle-4.10
.). Obejmuje prawie wszystkie rzeczywiste przypadki. Ale co się stanie, jeśli użytkownik nie ma już żadnej dystrybucji?Może ją pobrać ręcznie, korzystając z adresu URL w
.properties
pliku. Ale jeśli nie zlokalizuje go w ścieżce, której oczekiwał opakowanie , opakowanie pobierze go ponownie! Oczekiwana ścieżka jest całkowicie przewidywalna, ale jest poza tematem (zobacz tutaj, aby zobaczyć najbardziej złożoną część).Jest też kilka łatwiejszych (ale brudnych) sposobów. Na przykład może skopiować pliki opakowujące (z wyjątkiem
.properties
plików) z dowolnego innego lokalnego / zdalnego repozytorium do swojego repozytorium, a następnie uruchomić jegradlew
w swoim repozytorium. Automatycznie pobierze odpowiednią dystrybucję.źródło
Stare pytanie, nowa odpowiedź. Jeśli nie aktualizujesz gradle często (większość z nas tego nie robi), lepiej oddać to do VCS. Głównym powodem jest dla mnie zwiększenie szybkości kompilacji na serwerze CI. Obecnie większość projektów jest budowana i instalowana przez serwery CI, za każdym razem inna instancja serwera.
Jeśli tego nie zrobisz, serwer CI będzie pobierał jar dla każdej kompilacji i znacznie wydłuża czas kompilacji. Istnieją inne sposoby rozwiązania tego problemu, ale uważam, że ten jest najłatwiejszy w utrzymaniu.
źródło
Zgodnie z dokumentacją Gradle , oczekuje się dodania
gradle-wrapper.jar
do VCS, ponieważ udostępnienie Gradle Wrapper programistom jest częścią podejścia Gradle:źródło