Jak / kiedy wygenerować pliki otokowe Gradle?

212

Próbuję zrozumieć, jak działa Gradle Wrapper. W wielu repozytoriach źródłowych widzę następującą strukturę:

projectRoot/
    src/
    build.gradle
    gradle.properties
    settings.gradle
    gradlew
    gradlew.bat
    gradle/
        wrapper/
            gradle-wrapper.jar
            gradle-wrapper.properties

Moje pytania:

  1. Jak / kiedy generuje się gradlew/ gradlew.bat? Czy masz generować je tylko raz przy pierwszym tworzeniu projektu, czy generujesz je za każdym razem, gdy zatwierdzasz / wypychasz zmiany? A jak są one generowane?
  2. To samo pytanie powyżej, ale dla gradle/wrapper/*plików ( gradle-wrapper.jari gradle-wrapper.properties)?
  3. Czasami widzę inne *.gradlepliki w katalogu projektu gradle. Co to są te dodatkowe pliki Gradle i co one reprezentują / robią? Niestandardowe wtyczki?
  4. Jaka jest różnica we właściwościach, settings.gradlea które powinny być zdefiniowane w środku gradle.properties?
smeeb
źródło

Odpowiedzi:

250
  1. Generujesz go raz i jeszcze raz, gdy chcesz zmienić wersję Gradle używaną w projekcie. Tak często nie trzeba generować. Oto dokumenty. Wystarczy dodać wrapperzadanie do build.gradlepliku i uruchomić to zadanie, aby uzyskać strukturę opakowania.

    Pamiętaj, że musisz mieć zainstalowany Gradle, aby wygenerować opakowanie. Świetnym narzędziem do zarządzania artefaktami g-ekosystemu jest SDKMAN! . Aby wygenerować opakowanie stopniowe, dodaj do build.gradlepliku następujący fragment kodu :

    task wrapper(type: Wrapper) {
       gradleVersion = '2.0' //version required
    }
    

    i biegnij:

    gradle wrapper
    

    zadanie. Dodaj powstałe pliki do SCM (np. Git), a odtąd wszyscy programiści będą mieli tę samą wersję Gradle podczas korzystania z Gradle Wrapper.

    W programie Gradle 2.4 (lub nowszym) możesz skonfigurować opakowanie bez dodawania dedykowanego zadania:

    gradle wrapper --gradle-version 2.3
    

    lub

    gradle wrapper --gradle-distribution-url https://myEnterpriseRepository:7070/gradle/distributions/gradle-2.3-bin.zip
    

    Wszystkie szczegóły można znaleźć tutaj

Z 3.1 --distribution-typeopcji Gradle można również korzystać. Opcje są binarne i wszystkie oraz bin . wszystko dodatkowo zawiera kod źródłowy i dokumentację. wszystko jest również lepsze, gdy używa się IDE, więc edytor działa lepiej. Wadą jest to, że kompilacja może trwać dłużej (trzeba pobrać więcej danych, bez sensu na serwerze CI) i zajmie więcej miejsca.

  1. Są to pliki Wrapper Gradle. Musisz je wygenerować raz (dla konkretnej wersji) i dodać do kontroli wersji. Jeśli potrzebujesz zmienić wersję Gradle Wrapper, zmień wersję w build.gradlepatrz (1.) i ponownie wygeneruj pliki.

  2. Podaj szczegółowy przykład. Taki plik może mieć wiele celów: projekt wielomodułowy, podział odpowiedzialności, nieco zmodyfikowany skrypt itp.

  3. settings.gradleodpowiada raczej za strukturę projektu (moduły, nazwy itp.), natomiast gradle.propertiesjest używany za zewnętrzne szczegóły projektu i Gradle (wersja, argumenty wiersza poleceń -XX, właściwości itp.)

Opal
źródło
Dzięki @Opal (+1) - aby dać konkretny przykład dla nr 3, zobacz Netflix-Eureka . Co to są pliki Gradle?!?
smeeb,
Ok, widzę to. O ile widzę, programiści z Netflix po prostu podzielili jeden duży build.gradleskrypt na wiele krótszych i poświęcili jeden skrypt o określonym przeznaczeniu. Jak możesz skrypt umieszczony pod gradem zastosowany do głównego build.gradlepliku, zobacz: github.com/Netflix/eureka/blob/master/build.gradle . Miejsce, w którym umieszczasz takie moduły, jest twoim wyborem. To wszystko w ogóle. Jeśli odpowiedź jest satysfakcjonująca, proszę przyjąć odpowiedź :)
Opal
1
Inną przydatną opcją wiersza polecenia jest --distribution-typenp.gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee,
1
Dzięki @heenenee, doda to do mojej odpowiedzi.
Opal
Wskazówka: Android Studio ma folder Gradle w folderze instalacyjnym.
TWiStErRob
29

Generowanie owijarki stopniowej

Stopień kompilacji projektu

// Top-level build file where you can add configuration options common to all sub-projects/modules.

// Running 'gradle wrapper' will generate gradlew - Getting gradle wrapper working and using it will save you a lot of pain.
task wrapper(type: Wrapper) {
    gradleVersion = '2.2' 
}

// Look Google doesn't use Maven Central, they use jcenter now.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

Następnie w linii poleceń

gradle wrapper

Jeśli brakuje Ci oceny w systemie, zainstaluj ją lub powyższe nie będzie działać. Na komputerze Mac najlepiej zainstalować za pomocą Homebrew.

brew install gradle

Po pomyślnym uruchomieniu zadania opakowania i wygenerowaniu gradlewnie używaj gradacji systemu. Zaoszczędzi Ci wiele bólów głowy.

./gradlew assemble

A co z wtyczką gradle widoczną powyżej?

com.android.tools.build:gradle:1.0.1

Powinieneś ustawić najnowszą wersję, możesz sprawdzić stronę narzędzi i odpowiednio ją edytować.

Zobacz, co generuje Android Studio

Dodanie gradle i najnowszego Android Studio radykalnie zmieniło układ projektu. Jeśli masz starszy projekt, zdecydowanie polecam utworzenie czystego z najnowszym Android Studio i zobacz, co Google uważa za standardowy projekt.

Android Studio ma możliwości importowania starszych projektów, które również mogą pomóc.

Cameron Lowell Palmer
źródło
gradleVersion = '2.2'w taskWrappermożna używać niezależnie od wersji pragnę do generowania otoki, prawda? Nie musi to być najnowsza wersja gradle?
rafian
1
Przypuszczam, że możesz wrócić do 2 serii stopni. Wcale nie jestem pewien przed wersją 2.x, ale nie, nie musi być zgodne z absolutną najnowszą wersją.
Cameron Lowell Palmer
18

Począwszy od wersji Gradle 2.4, można użyć gradle wrapper --gradle-version X.Xdo skonfigurowania określonej wersji opakowania Gradle, bez dodawania żadnych zadań do build.gradlepliku. Następnym razem, gdy użyjesz opakowania, pobierze odpowiednią dystrybucję Gradle, która będzie pasować.

Craig Trader
źródło
10

Jeśli chcesz pobrać gradle ze źródłem i dokumentami, domyślny adres URL dystrybucji skonfigurowany w gradle-wrapper.properites nie spełni twoich potrzeb. Jest to https://services.gradle.org/distribution/gradle-2.10-bin.zip , nie https://services.gradle.org/distribution/gradle-2.10-all.zip. Ten pełny adres URL jest sugerowany przez IDE, taki jak Android Studio. Jeśli chcesz pobrać pełną wersję, możesz skonfigurować takie zadanie otoki :

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}
Geng Jiawen
źródło
1
W przypadku nowszych wersji gradle (nie jestem pewien, który dokładnie) - zamiast ręcznego przepisywania adresu URL, prawdopodobnie najlepiej jest użyć wbudowanego polecenia w tym samym zamknięciu: DistributionType = Wrapper.DistributionType.ALL
Dave Birch
6

Jest to polecenie, którego należy użyć, aby powiedzieć Gradle'owi, aby zaktualizował opakowanie tak, aby pobierał wersje dystrybucyjne bibliotek zawierających kod źródłowy:

./gradlew wrapper --gradle-version <version> --distribution-type all

Podanie typu dystrybucji jako „wszystkie” zapewni, że Gradle pobierze pliki źródłowe do wykorzystania przez środowisko programistyczne.

Plusy :

  • IDE będą miały natychmiastowy dostęp do kodu źródłowego. Na przykład Intellij IDEA nie monituje o aktualizację skryptów kompilacji w celu uwzględnienia dystrybucji źródłowej (ponieważ to polecenie już to zrobiło)

Wady :

  • Dłuższy / większy proces kompilacji, ponieważ pobiera kod źródłowy. Jest to strata czasu / miejsca na kompilacji lub serwerze CI, gdzie kod źródłowy nie jest konieczny.

Skomentuj lub podaj inną odpowiedź, jeśli znasz jakąkolwiek opcję wiersza poleceń, która mówi Gradle, aby nie pobierał źródeł na serwerze kompilacji.

Wystrzyżony
źródło
1
Czy jesteś pewien, że to ustawienie dotyczy bibliotek? Oficjalne dokumenty mówią inaczej i odnoszą się tylko do samego opakowania: „Rodzaj rozkładu Gradle, który ma być używany przez opakowanie”. docs.gradle.org/current/dsl/…
Thorsten Schöning,
2
  1. Wygenerujesz je raz, ale zaktualizuj je, jeśli potrzebujesz nowej funkcji lub czegoś z wtyczki, która z kolei potrzebuje nowszej wersji stopniowej.

    Najprostszy sposób na aktualizację: począwszy od wersji 2.2, możesz po prostu pobrać i wyodrębnić pełną lub binarną dystrybucję Gradle i uruchomić:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    Nie musisz definiować zadania, chociaż prawdopodobnie potrzebujesz jakiegoś build.gradlepliku.

    Spowoduje to zaktualizowanie lub utworzenie gradlewi gradlew.batotoki, a także gradle/wrapper/gradle-wrapper.propertiesi gradle-wrapper.jarzapewni bieżącą wersję gradle, opakowaną.

  2. Wszystkie są częścią opakowania.

  3. Niektóre build.gradlepliki odnoszą się do innych plików lub plików w podkatalogach, które są podprojektami lub modułami. To staje się nieco skomplikowane, ale jeśli masz jeden projekt, potrzebujesz jednego pliku.

  4. settings.gradleobsługuje projekt, moduł i inne rodzaje nazw i ustawień, gradle.propertieskonfiguruje zmienne wielokrotnego użytku dla twoich plików stopni, jeśli chcesz i czujesz, że byłyby w ten sposób jaśniejsze.

dlamblin
źródło
2

Ponieważ wbudowane zadania stopni są przestarzałe w wersji 4.8, spróbuj poniżej

wrapper {
   gradleVersion = '2.0' //version required
}

i biegnij

gradle wrapper
kreślarz
źródło