web-dev-qa-db-ja.com

Gradleに相当するMavenプロファイル

私は私のスプリングブートプロジェクトビルドで単純なシナリオを達成しようとしています:依存関係を含める/除外し、環境に応じてwarまたはjarをパッケージ化します。

したがって、たとえば、環境にはdevにdevtoolsとパッケージjarが含まれ、prodにはパッケージwarなどが含まれます。

私はそれがXMLベースの構成ではなくなったことを知っており、基本的に自分のbuild.gradleでifステートメントを書くことができますが、これを達成するための推奨される方法はありますか?

複数のビルドファイルを作成する代わりに、いくつかの一般的な依存関係を宣言して、それらを単一のファイルで参照できますか?

ビルドターゲット環境に基づいてビルド構成を変更するベストプラクティスはありますか?

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

私のバージョン( 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

いくつかのコード行をファイルsettings.gradleに追加して、異なるビルドファイルを完全に切り替えると便利な場合もあります。このソリューションは、環境変数BUILD_PROFILEを読み取り、それを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"

次に、このようにgradleを実行します。 build-local.gradleを使用するには:

$ BUILD_PROFILE="local" gradle compileJava
> Processing settings.gradle
> Build profile: local
> Build file: build-local.gradle

BUILD SUCCESSFUL in 3s

このアプローチはCI/CDパイプラインでも機能します。CIやCDパイプラインでは、品質ゲートのチェックや、ローカルで実行したくない他の時間のかかる処理など、追加のタスクが必要になる場合があります。

0
IPP Nerd