Comment importer un script Gradle dans un autre?

97

J'ai un script de gradle complexe qui englobe une charge de fonctionnalités autour de la construction et du déploiement d'un certain nombre de projets netbeans dans un certain nombre d'environnements.

Le script fonctionne très bien, mais essentiellement, tout est configuré à travers une demi-douzaine de cartes contenant des informations sur le projet et l'environnement.

Je veux résumer les tâches dans un autre fichier, afin de pouvoir simplement définir mes cartes dans un simple fichier de construction et importer les tâches de l'autre fichier. De cette façon, je peux utiliser les mêmes tâches principales pour un certain nombre de projets et configurer ces projets avec un simple ensemble de cartes.

Quelqu'un peut-il me dire comment je peux importer un fichier gradle dans un autre, d'une manière similaire à la tâche d'Ant? J'ai parcouru les documents de Gradle en vain jusqu'à présent.

Information additionnelle

Après la réponse de Tom ci-dessous, j'ai pensé essayer de clarifier exactement ce que je voulais dire.

Fondamentalement, j'ai un script gradle qui exécute un certain nombre de sous-projets. Cependant, les sous-projets sont tous des projets Netbeans, et sont livrés avec leurs propres scripts de construction de fourmis, donc j'ai des tâches en gradle pour appeler chacun d'entre eux.

Mon problème est que j'ai une configuration en haut du fichier, telle que:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

Je génère ensuite des tâches telles que:

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})

J'ai beaucoup de ces sortes d'extraits de génération de tâches, et tous sont génériques - ils dépendent entièrement de la configuration dans la liste des projets.

Donc, ce que je veux, c'est un moyen de mettre cela dans un script séparé et de l'importer de la manière suivante:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.

Ainsi, dans cet exemple, tasks.gradle contiendra tout le code de génération de tâche générique et sera exécuté pour les projets définis dans le fichier build.gradle principal. De cette façon, tasks.gradle est un fichier qui peut être utilisé par tous les grands projets qui consistent en un certain nombre de sous-projets avec des fichiers de construction et Netbeans.

Anthony Roy
la source
3
Considérez la construction "apply from: 'other.gradle'" pour importer des déclarations externes. (Voir "12.4. Configurer le projet à l'aide d'un script de construction externe" ici gradle.org/0.9-preview-1/docs/userguide/… )
Petr Gladkikh
@PetrGladkikh apply fromexécute immédiatement les tâches externes. Cela peut ne pas être préférable dans la logique d'exécution (c'est-à-dire que je voudrais exécuter les tâches quand je le souhaite, pas tout de suite).
IgorGanapolsky
Cette déclaration dans le commentaire ci-dessus n'est pas vraie : apply fromexécute immédiatement les tâches externes. Ne vous laissez pas induire en erreur. Les tâches externes sont configurées, non exécutées.
Jarekczek
Reproduction possible de Y a
tkruse

Réponses:

17

La réponse à la question s'est avérée être dans le système Plugins, où vous pouvez ajouter la fonctionnalité souhaitée dans un ensemble de plugins qui peuvent être des fichiers groovy situés dans le répertoire buildSrc/src/main/groovy. Les plugins peuvent également être regroupés sous forme de Jar bien que je n'ai pas essayé cela.

Détails ici: Plugins personnalisés

Anthony Roy
la source
Juste pour que vous sachiez que le lien est rompu - voici une mise à jour gradle.org/docs/current/userguide
...
Lien vers le plugin: gradle.org/docs/current/userguide/…
JARC
4

Eh bien, il est difficile de dire ce qui vous sert le mieux sans voir votre fichier de construction.

Je pourrais supposer que la configuration de votre environnement en tant que construction multi-projets devrait vous fournir l'abstraction que vous recherchez.

Dans la racine de votre projet, build.gradlevous définissez tous les éléments spécifiques à votre domaine ainsi que les éléments qui s'appliquent à tous vos sous-projets:

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'destRepo'
        addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
        addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
        descriptor = 'optional'
        checkmodified = true
    }
    ...
}
...
subprojects {
    sourceCompatibility = 1.5
    targetCompatibility = 1.5
    group = 'my.group'
    version = '1.0'
    uploadArchives {
        uploadDescriptor = true
        repositories {
            add rootProject.repositories.destRepo
        }
    }
    apply{ type my.group.gradle.api.plugins.MyPlugin }
    ...
}

dependsOnChildren()

Le répertoire racine du projet peut également contenir un gradle.propertiesfichier dans lequel vous définissez les propriétés utilisées par vos projets:

buildDirName=staging
repo.dest.dir=/var/repo
...

Ensuite, dans un fichier supplémentaire de la racine de votre projet, settings.gradlevous pointez réellement vers vos sous-projets:

include 'my-first-component',
        'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...

Chaque répertoire de sous-projet contient un build.gradlefichier contenant uniquement les éléments spécifiques au sous-projet.

Peu importe si vous appelez à gradlepartir de la racine de votre projet ou du répertoire de sous-projet, gradle considérera automatiquement toutes vos définitions faites dans les différents fichiers.

Notez également qu'aucune tâche de compilation ne sera exécutée pour la racine de votre projet tant que vous ne chargez aucun plugin au-delà du plugin par défaut au niveau racine.

À M
la source
1
Merci d'avoir pris le temps de répondre. Ce ne sont pas des sous-projets avec lesquels j'ai des problèmes, mais plutôt la création d'une «bibliothèque» de tâches courantes. J'ai modifié ma question d'origine avec plus d'informations et des extraits de code pour rendre les choses plus claires.
Anthony Roy
1
Ainsi, au lieu de faire l'importation ("tasks.gradle") à partir de votre exemple, vous auriez la section sous-projets {} spécifiant le code de génération de tâche générique utilisé par tous vos sous-projets. Cela devrait fournir la même abstraction que vous recherchez !?
Tom
Le plugin Ivy est-il vraiment nécessaire ici? Gradle ne peut-il pas être utilisé seul?
IgorGanapolsky