J'essaie de réaliser un scénario simple dans la construction de mon projet de démarrage de printemps: inclure/exclure les dépendances et emballer la guerre ou le bocal en fonction de l'environnement.
Ainsi, par exemple, pour l'environnement dev
incluez devtools et package jar, pour prod
package war etc.
Je sais que ce n'est plus une configuration basée sur XML et je peux essentiellement écrire des instructions if dans mon build.gradle, mais existe-t-il un moyen recommandé d'y parvenir?
Puis-je déclarer certaines dépendances courantes et les référencer dans un seul fichier au lieu de créer plusieurs fichiers de construction?
Existe-t-il une meilleure pratique pour changer la configuration de build en fonction de l'environnement cible de build?
ext {
devDependencies = ['org.foo:dep1:1.0', 'org.foo:dep2:1.0']
prodDependencies = ['org.foo:dep3:1.0', 'org.foo:dep4:1.0']
isProd = System.properties['env'] == 'prod'
isDev = System.properties['env'] == 'dev'
}
apply plugin: 'Java'
dependencies {
compile 'org.foo:common:1.0'
if (isProd) {
compile prodDependencies
}
if (isDev) {
compile devDependencies
}
}
if (isDev) tasks.withType(War).all { it.enabled = false }
Ma version (inspirée de réponse de Lance Java ):
apply plugin: 'war'
ext {
devDependencies = {
compile 'org.foo:dep1:1.0', {
exclude module: 'submodule'
}
runtime 'org.foo:dep2:1.0'
}
prodDependencies = {
compile 'org.foo:dep1:1.1'
}
commonDependencies = {
compileOnly 'javax.servlet:javax.servlet-api:3.0.1'
}
env = findProperty('env') ?: 'dev'
}
dependencies project."${env}Dependencies"
dependencies project.commonDependencies
if (env == 'dev') {
war.enabled = false
}
Parfois, il est également utile de basculer complètement entre les différents fichiers de construction en ajoutant quelques lignes de code au fichier settings.gradle
. Cette solution lit la variable d'environnement BUILD_PROFILE
et l'insère dans le buildFileName
:
# File: settings.gradle
println "> Processing settings.gradle"
def buildProfile = System.getenv("BUILD_PROFILE")
if(buildProfile != null) {
println "> Build profile: $buildProfile"
rootProject.buildFileName = "build-${buildProfile}.gradle"
}
println "> Build file: $rootProject.buildFileName"
Ensuite, vous exécutez gradle comme ceci, par exemple utiliser build-local.gradle
:
$ BUILD_PROFILE="local" gradle compileJava
> Processing settings.gradle
> Build profile: local
> Build file: build-local.gradle
BUILD SUCCESSFUL in 3s
Cette approche fonctionne également pour les pipelines CI/CD où vous souhaiterez peut-être ajouter des tâches supplémentaires telles que la vérification des portes de qualité ou d'autres choses chronophages que vous ne souhaitez pas exécuter localement.