Comment / quand générer des fichiers wrapper Gradle?

212

J'essaie de comprendre comment fonctionne le Gradle Wrapper. Dans de nombreux référentiels sources, je vois la structure suivante:

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

Mes questions:

  1. Comment / quand génère gradlew- gradlew.batt- on / ? Êtes-vous censé les générer une seule fois lors de la création du projet, les générez-vous chaque fois que vous validez / envoyez des modifications? Et comment sont-ils générés?
  2. Même question ci-dessus, mais pour les gradle/wrapper/*fichiers ( gradle-wrapper.jaret gradle-wrapper.properties)?
  3. Parfois, je vois d'autres *.gradlefichiers dans le gradlerépertoire du projet . Quels sont ces fichiers Gradle supplémentaires et que représentent-ils / font-ils? Plugins personnalisés?
  4. Quelle est la différence entre les propriétés qui entrent settings.gradleet ce qui devrait être défini à l'intérieur gradle.properties?
smeeb
la source

Réponses:

251
  1. Vous le générez une fois de plus lorsque vous souhaitez modifier la version de Gradle que vous utilisez dans le projet. Il n'est pas nécessaire de générer si souvent. Voici les documents. Ajoutez simplement une wrappertâche au build.gradlefichier et exécutez cette tâche pour obtenir la structure de l'encapsuleur.

    N'oubliez pas que Gradle doit être installé pour générer un wrapper. SDKMAN est un excellent outil pour gérer les artefacts de l'écosystème g! . Pour générer un wrapper gradle, ajoutez le morceau de code suivant au build.gradlefichier:

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

    et courir:

    gradle wrapper
    

    tâche. Ajoutez les fichiers résultants à SCM (par exemple git) et à partir de maintenant tous les développeurs auront la même version de Gradle lors de l'utilisation de Gradle Wrapper.

    Avec Gradle 2.4 (ou supérieur), vous pouvez configurer un wrapper sans ajouter de tâche dédiée:

    gradle wrapper --gradle-version 2.3
    

    ou

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

    Tous les détails peuvent être trouvés ici

De l' 3.1 --distribution-typeoption Gradle peut également être utilisée. Les options sont binaires et tout et bin . tous contiennent en outre du code source et de la documentation. tout est également meilleur lorsque l'IDE est utilisé, donc l'éditeur fonctionne mieux. L'inconvénient est que la construction peut durer plus longtemps (besoin de télécharger plus de données, inutile sur le serveur CI) et cela prendra plus d'espace.

  1. Ce sont des fichiers Gradle Wrapper. Vous devez les générer une fois (pour une version particulière) et les ajouter au contrôle de version. Si vous devez changer la version de Gradle Wrapper, changez la version dans build.gradlevoir (1.) et régénérez les fichiers.

  2. Donnez un exemple détaillé. Ce fichier peut avoir plusieurs objectifs: projet multi-module, séparation des responsabilités, script légèrement modifié, etc.

  3. settings.gradleest plutôt responsable de la structure du projet (modules, noms, etc.), tandis que, gradle.propertiesest utilisé pour les détails externes du projet et de Gradle (version, arguments de ligne de commande -XX, propriétés, etc.)

Opale
la source
Merci @Opal (+1) - pour vous donner un exemple spécifique pour # 3, voir Netflix-Eureka . Quels sont ces fichiers Gradle?!?
smeeb
Ok, je le vois. Pour autant que je sache, les développeurs de Netflix viennent de diviser un gros build.gradlescript en plusieurs plus courts et consacrés à des scripts à usage particulier. Comme vous pouvez le script situé sous gradle dir a appliqué au build.gradlefichier principal , consultez: github.com/Netflix/eureka/blob/master/build.gradle . L'endroit où vous placez ces modules est de votre choix. C'est tout en général. Si vous êtes satisfait de la réponse, veuillez accepter la réponse :)
Opal
1
Une autre option utile en ligne de commande est --distribution-type, par exemple,gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee
1
Merci @heenenee, l'ajoutera à ma réponse.
Opal
Astuce: Android Studio a un Gradle dans son dossier d'installation.
TWiStErRob
29

Génération du Gradle Wrapper

Projet de construction gradle

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

Ensuite, lors de l'exécution en ligne de commande

gradle wrapper

Si vous manquez gradle sur votre système, installez-le ou ce qui précède ne fonctionnera pas. Sur un Mac, il est préférable d'installer via Homebrew.

brew install gradle

Après avoir correctement exécuté la tâche wrapper et généré gradlew, n'utilisez pas votre gradle système. Cela vous évitera beaucoup de maux de tête.

./gradlew assemble

Qu'en est-il du plugin Gradle vu ci-dessus?

com.android.tools.build:gradle:1.0.1

Vous devez définir la version pour être la dernière et vous pouvez consulter la page des outils et modifier la version en conséquence.

Découvrez ce que génère Android Studio

L'ajout de gradle et du plus récent Android Studio a radicalement changé la disposition du projet. Si vous avez un projet plus ancien, je vous recommande vivement d'en créer un propre avec le dernier Android Studio et de voir ce que Google considère comme le projet standard.

Android Studio possède des fonctionnalités pour importer des projets plus anciens qui peuvent également aider.

Cameron Lowell Palmer
la source
gradleVersion = '2.2'en taskWrapperpeut utiliser la version que je souhaite pour générer le wrapper, correct? Ne doit-il pas nécessairement s'agir de la dernière version de gradle?
raffian
1
Je suppose que vous pouvez revenir dans la série 2 de Gradle. Je ne suis pas du tout sûr avant 2.x, mais non, il n'a pas besoin de suivre la dernière version absolue.
Cameron Lowell Palmer
18

Depuis Gradle 2.4, vous pouvez utiliser gradle wrapper --gradle-version X.Xpour configurer une version spécifique du wrapper Gradle, sans ajouter de tâches à votre build.gradlefichier. La prochaine fois que vous utiliserez le wrapper, il téléchargera la distribution Gradle appropriée pour correspondre.

Craig Trader
la source
10

Si vous souhaitez télécharger gradle avec la source et les documents, l'URL de distribution par défaut configurée dans gradle-wrapper.properites ne satisfera pas votre besoin.Il s'agit de https://services.gradle.org/distributions/gradle-2.10-bin.zip , pas https://services.gradle.org/distributions/gradle-2.10-all.zip .Cette URL complète est suggérée par IDE comme Android Studio.Si vous souhaitez télécharger le grade complet, vous pouvez configurer la tâche d'encapsuleur comme ceci :

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}
Geng Jiawen
la source
1
Avec des versions plus récentes de gradle (je ne sais pas exactement laquelle) - plutôt que de réécrire manuellement l'URL, il est probablement préférable d'utiliser la commande intégrée dans la même fermeture: distributionType = Wrapper.DistributionType.ALL
Dave Birch
6

Il s'agit de la commande à utiliser pour indiquer à Gradle de mettre à niveau le wrapper de telle sorte qu'il récupère les versions de distribution des bibliothèques qui incluent le code source:

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

Si vous spécifiez le type de distribution avec "all", Gradle téléchargera les fichiers source à utiliser par votre environnement de développement.

Avantages :

  • Les IDE auront un accès immédiat au code source. Par exemple, Intellij IDEA ne vous demandera pas de mettre à jour vos scripts de build pour inclure la distribution source (car cette commande l'a déjà fait)

Inconvénients :

  • Processus de construction plus long / plus grand car il télécharge du code source. C'est une perte de temps / d'espace sur un build ou un serveur CI où le code source n'est pas nécessaire.

Veuillez commenter ou fournir une autre réponse si vous connaissez une option de ligne de commande pour dire à Gradle de ne pas télécharger les sources sur un serveur de build.

Dépouillé
la source
1
Êtes-vous sûr que ce paramètre concerne les bibliothèques? Les documents officiels disent le contraire et se réfèrent au wrapper lui-même uniquement: "Le type de la distribution Gradle à utiliser par le wrapper." docs.gradle.org/current/dsl/…
Thorsten Schöning
2
  1. Vous les générerez une fois, mais mettez-les à jour si vous avez besoin d'une nouvelle fonctionnalité ou de quelque chose d'un plugin qui à son tour a besoin d'une nouvelle version gradle.

    Mise à jour la plus simple: à partir de Gradle 2.2, vous pouvez simplement télécharger et extraire la distribution Gradle complète ou binaire , et exécuter:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    Pas besoin de définir une tâche, même si vous avez probablement besoin d'une sorte de build.gradlefichier.

    Cela mettra à jour ou créera le wrapper gradlewet gradlew.batainsi que gradle/wrapper/gradle-wrapper.propertiesle gradle-wrapper.jarpour fournir la version actuelle de gradle, enveloppée.

  2. Tout cela fait partie de l'emballage.

  3. Certains build.gradlefichiers font référence à d'autres fichiers ou fichiers dans des sous-répertoires qui sont des sous-projets ou modules. Cela devient un peu compliqué, mais si vous avez un projet, vous avez essentiellement besoin d'un seul fichier.

  4. settings.gradlegère le projet, le module et d'autres types de noms et de paramètres, gradle.propertiesconfigure les variables réutilisables pour vos fichiers Gradle si vous le souhaitez et vous pensez qu'ils seraient plus clairs de cette façon.

dlamblin
la source
2

Comme les tâches intégrées de Gradle sont obsolètes en 4.8, essayez ci-dessous

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

et courir

gradle wrapper
drafterr
la source