ボールを蹴りたいシステムエンジニア

ボール蹴りが大好きなシステムエンジニア、ボールを蹴る時間確保の為に時間がある時には勉強する。

Gradleで環境毎に設定ファイルを切り替え

Gradleでビルドする際に、ローカル環境と商用環境で設定ファイルの値を変更したい。
設定ファイル内の指定キーの値を書き換える方法があればスマートだなと思って調査したけれどもそのような方法は見つからず。
方法としては2つあった。

  1. 設定ファイル内で置換用変数を記述してgradleから指定して置換する方法
  2. 設定ファイルをローカル用と商用の2用意して、gradleでビルド実行時に引数で環境を指定して上書き。

1番の方法だと、良い設定ファイル値の管理方法が思い浮かばなかったので、2番の方法を採用。
ただ、2番の方法だと、同じ設定ファイルが複数存在する事となるので、保守コストが上がりそうなのでスマートでない気がする。
とりあえず2番の方法で試してみる。

以下のような構成で設定ファイルを管理する。


├resources
  ├environment────┬ local ─ system.properties
  system.properties ├ deploy ─ system.properties


値の異なる設定ファイルが3つになる...


build.gradleの設定は以下の通り。

apply plugin: 'java'

defaultTasks 'copyEnvironmentConfig', 'build' 

//Java文字コードエンコード
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

//環境ごとの設定ファイル上書き
task copyEnvironmentConfig(type: Copy) {
	//ex) 引数に指定 -Penv=local
	if (project.hasProperty('env')) {
	    from "resources/environment/${env}/"
	    into "resources/"
	} else {
		println "use default environment"
	}
}

sourceSets.main.output.classesDir = file("$buildDir/classes")
sourceSets.main.output.resourcesDir = file("$buildDir/classes")
    
sourceSets {
	main {
	    java {
	        srcDir 'src/'
	    }
            resources {
                srcDir 'resources'
            }
	}
}

dependencies {
  compile fileTree(dir: './lib', includes: ['*.jar'])
}

環境毎に設定ファイルを切り替える為、copyEnvironmentConfigというタスクを定義。
ビルド時にenvという引数を指定時に指定文字列に応じたディレクトリの設定ファイルを上書きしている。
また、copyEnvironmentConfigはデフォルトタスクに設定している。

ローカル環境ででビルド実行時はホームディレクトリに移動して以下実行。

$ gradle -Penv=local

設定ファイルのキーを指定して値を上書きする方法は無いものか。。