Come / quando generare file wrapper Gradle?


212

Sto cercando di capire come funziona il Gradle Wrapper. In molti repository di origine, vedo la seguente struttura:

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

Le mie domande:

  1. Come / quando si genera gradlew/ gradlew.bat? Dovresti generarli solo una volta quando il progetto viene creato per la prima volta, li generi ogni volta che commetti / invii modifiche? E come vengono generati?
  2. Stessa domanda sopra, ma per i gradle/wrapper/*file ( gradle-wrapper.jare gradle-wrapper.properties)?
  3. Alcune volte vedo altri *.gradlefile nella directory del progetto gradle. Che cosa sono questi file Gradle aggiuntivi e cosa rappresentano / fanno? Plugin personalizzati?
  4. Qual è la differenza nelle proprietà che vanno settings.gradlerispetto a ciò che dovrebbe essere definito all'interno gradle.properties?

Risposte:


251
  1. Lo generi una volta, e ancora quando desideri cambiare la versione di Gradle che usi nel progetto. Non è necessario generare è così spesso. Ecco i documenti. Basta aggiungere wrapperattività al build.gradlefile ed eseguire questa attività per ottenere la struttura del wrapper.

    Tieni presente che è necessario disporre di Gradle installato per generare un wrapper. Un ottimo strumento per la gestione dei manufatti dell'ecosistema g è SDKMAN! . Per generare un wrapper gradle, aggiungi il seguente pezzo di codice al build.gradlefile:

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

    e corri:

    gradle wrapper
    

    compito. Aggiungi i file risultanti a SCM (ad esempio git) e da ora tutti gli sviluppatori avranno la stessa versione di Gradle quando usano Gradle Wrapper.

    Con Gradle 2.4 (o successivo) è possibile impostare un wrapper senza aggiungere un'attività dedicata:

    gradle wrapper --gradle-version 2.3
    

    o

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

    Tutti i dettagli possono essere trovati qui

Dall'opzione Gradle 3.1 --distribution-typepuò anche essere usata. Le opzioni sono binarie e all e bin . tutto contiene inoltre codice sorgente e documentazione. tutto è anche meglio quando si utilizza IDE, quindi l'editor funziona meglio. Lo svantaggio è che la build potrebbe durare più a lungo (è necessario scaricare più dati, inutile sul server CI) e richiederà più spazio.

  1. Questi sono i file Gradle Wrapper. È necessario generarli una volta (per una versione particolare) e aggiungerli al controllo versione. Se è necessario modificare la versione di Gradle Wrapper, modificare la versione in build.gradlevedi (1.) e rigenerare i file.

  2. Fai un esempio dettagliato. Tale file può avere molteplici scopi: progetto multi-modulo, separazione delle responsabilità, script leggermente modificato, ecc.

  3. settings.gradleè piuttosto responsabile della struttura del progetto (moduli, nomi, ecc.), mentre gradle.propertiesè usato per i dettagli esterni del progetto e del Gradle (versione, argomenti della riga di comando -XX, proprietà ecc.)


Grazie @Opal (+1) - per darti un esempio specifico per # 3, vedi Netflix-Eureka . Cosa sono questi file Gradle?!?
smeeb,

Ok, lo vedo. Per quanto vedo, gli sviluppatori di Netflix hanno appena diviso un grande build.gradlescript in più brevi e dedicato a script con uno scopo particolare. Come puoi lo script che si trova sotto la directory gradle e viene applicato al build.gradlefile principale , visualizza: github.com/Netflix/eureka/blob/master/build.gradle . Dove metti tali moduli è di tua scelta. Questo è tutto in generale. Se sei soddisfatto della risposta, accetta la risposta :)
Opal

1
Un'altra utile opzione da riga di comando è --distribution-type, ad esempio,gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee,

1
Grazie @heenenee, lo aggiungerò alla mia risposta.
Opale

Suggerimento: Android Studio ha un Gradle nella sua cartella di installazione.
TWiStErRob

29

Generazione del wrapper Gradle

Grado di compilazione del progetto

// 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()
    }
}

Quindi alla riga di comando

gradle wrapper

Se ti manca il gradle sul tuo sistema, installalo o quanto sopra non funzionerà. Su un Mac è consigliabile installare tramite Homebrew.

brew install gradle

Dopo aver eseguito correttamente l'attività wrapper e averlo generato gradlew, non utilizzare il gradle di sistema. Ti farà risparmiare un sacco di mal di testa.

./gradlew assemble

Che dire del plugin gradle visto sopra?

com.android.tools.build:gradle:1.0.1

Dovresti impostare la versione come l'ultima e puoi farlo controllare la pagina degli strumenti e modificare la versione di conseguenza.

Guarda cosa genera Android Studio

L'aggiunta di Gradle e il nuovissimo Android Studio hanno cambiato radicalmente il layout del progetto. Se hai un progetto più vecchio, ti consiglio vivamente di crearne uno nuovo con l'ultimo Android Studio e vedere cosa considera Google il progetto standard.

Android Studio dispone di funzionalità per l'importazione di progetti meno recenti che possono anche aiutare.


gradleVersion = '2.2'in taskWrappergrado di utilizzare qualsiasi versione che desidero per la generazione il wrapper, giusto? Non deve essere l'ultima versione di Gradle?
Raffian,

1
Suppongo che tu possa tornare indietro nella seconda serie di gradi. Non ne sono affatto sicuro prima della 2.x, ma no, non è necessario seguire l'ultima versione assoluta.
Cameron Lowell Palmer,

18

A partire da Gradle 2.4, è possibile utilizzare gradle wrapper --gradle-version X.Xper configurare una versione specifica del wrapper Gradle, senza aggiungere alcuna attività al build.gradlefile. Al successivo utilizzo del wrapper, verrà scaricata la distribuzione Gradle appropriata da abbinare.


10

Se desideri scaricare il gradle con sorgente e documenti, l'URL di distribuzione predefinito configurato in gradle-wrapper.properites non soddisferà le tue esigenze. È https://services.gradle.org/distributions/gradle-2.10-bin.zip , non https://services.gradle.org/distributions/gradle-2.10-all.zip . Questo URL completo è suggerito da IDE come Android Studio. Se desideri scaricare il voto completo, puoi configurare l'attività wrapper in questo modo :

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}

1
Con le build più recenti di gradle (non sono sicuro di quale delle due) - piuttosto che riscrivere manualmente l'url, è probabilmente meglio usare il comando integrato nella stessa chiusura: distributionType = Wrapper.DistributionType.ALL
Dave Birch

6

Questo è il comando da usare per dire a Gradle di aggiornare il wrapper in modo che afferrerà le versioni di distribuzione delle librerie che include il codice sorgente:

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

Se si specifica il tipo di distribuzione con "all", Gradle scarica i file di origine da utilizzare nell'ambiente di sviluppo.

Pro :

  • Gli IDE avranno accesso immediato al codice sorgente. Ad esempio, Intellij IDEA non ti chiederà di aggiornare gli script di compilazione per includere la distribuzione di origine (poiché questo comando lo ha già fatto)

Contro :

  • Processo di compilazione più lungo / più grande perché sta scaricando il codice sorgente. Questo è uno spreco di tempo / spazio su un server build o CI in cui il codice sorgente non è necessario.

Commenta o fornisci un'altra risposta se sei a conoscenza di un'opzione della riga di comando per dire a Gradle di non scaricare fonti su un server di build.


1
Sei sicuro che questa impostazione riguardi le librerie? I documenti ufficiali dicono diversamente e si riferiscono solo al wrapper stesso: "Il tipo di distribuzione Gradle che deve essere usato dal wrapper". docs.gradle.org/current/dsl/…
Thorsten Schöning il

2
  1. Li genererai una volta, ma li aggiornerai se hai bisogno di una nuova funzionalità o qualcosa da un plug-in che a sua volta ha bisogno di una versione gradle più recente.

    Il modo più semplice per aggiornare: a partire dal Gradle 2.2 puoi semplicemente scaricare ed estrarre la distribuzione Gradle completa o binaria ed eseguire:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    Non è necessario definire un'attività, anche se probabilmente è necessario un qualche tipo di build.gradle file.

    Ciò aggiornerà o creerà il wrapper gradlewe gradlew.batil nonché gradle/wrapper/gradle-wrapper.propertiesil gradle-wrapper.jarfornire la versione corrente di gradle, incartata.

  2. Questi fanno tutti parte del wrapper.

  3. Alcuni build.gradlefile fanno riferimento ad altri file o file in sottodirectory che sono sottoprogetti o moduli. Diventa un po 'complicato, ma se hai un progetto in pratica hai bisogno di un solo file.

  4. settings.gradlegestisce il progetto, il modulo e altri tipi di nomi e impostazioni, gradle.propertiesconfigura le variabili riutilizzabili per i file gradle se lo desideri e ritieni che sarebbero più chiari in quel modo.


2

Poiché le attività incorporate di Gradle sono obsolete in 4.8, provare di seguito

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

e corri

gradle wrapper
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.