web-dev-qa-db-fra.com

Profils Maven équivalents à Gradle

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?

18
Mehmet Catalbas
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 }
21
lance-java

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
}
6
Vyacheslav Shvets

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.

0
IPP Nerd