web-dev-qa-db-fra.com

Existe-t-il un moyen de diviser / factoriser les parties communes de la construction Gradle

Nous avons plusieurs versions indépendantes (chaque version indépendante est une version multi-projets). Les scripts de construction principaux deviennent assez volumineux car nous avons un ensemble de tâches communes réutilisées par les sous-projets et il y a beaucoup de répétition entre les générations indépendantes. Ce que nous recherchons, c'est:

  1. Un moyen de diviser le fichier de construction principal en fichiers plus petits
  2. Un moyen de réutiliser certaines parties de la build dans d'autres builds indépendants

Quelle est la meilleure façon d'y parvenir à Gradle?

52
Andrey Adamovich

Gradle 0.9 vous permet d'importer un script de build à partir d'un autre script de build. Jetez un œil à: Configuration du projet à l'aide d'un script de build externe . Fondamentalement, c'est apply from: 'other.gradle'.

Une chose que le guide de l'utilisateur ne mentionne pas est que le paramètre 'from' peut être une URL, donc vous pouvez rendre vos scripts partagés disponibles via HTTP quelque part (par exemple votre dépôt Subversion), et les importer à partir de plusieurs builds.

55
Adam Murdoch

La solution que j'ai trouvée implique de mapper les éléments que vous avez dans votre fichier other.gradle.

def getVersionName = { ->
    def stdout = new ByteArrayOutputStream()
    exec {
        commandLine 'git', 'describe', '--tags'
        standardOutput = stdout
    }
    return stdout.toString().trim()
}
ext{
    VERConsts = [:]
    VERConsts['NAME'] = getVersionName()
    VERConsts['NAME_CALL'] = getVersionName
}

Ensuite, dans votre fichier build.gradle:

apply from: 'other.gradle'
// ...
Android {
    defaultConfig {
        versionName VERConsts['NAME_CALL']()
        // or
        versionName VERConsts['NAME']
    }
}

Ensuite, le versionName aura le résultat de l'appel.

Notes:

  • VERConsts['NAME'] = getVersionName() appellera getVersionName() et stockera son résultat. L'utiliser dans votre script, par exemple versionName VERConsts['NAME'] Attribuera alors la valeur stockée.
  • VERConsts['NAME_CALL'] Stockera à la place une référence à la fonction. L'utilisation de VERConsts['NAME_CALL']() dans votre script va en fait appeler la fonction et affecter le résultat à votre variable

La première entraînera l'affectation de la même valeur dans le script tandis que la seconde peut entraîner des valeurs différentes (par exemple, si quelqu'un pousse une autre version pendant l'exécution de votre script).

29
Laur Ivan