Gradle で環境ごとに構成を変更する その3
前回、前々回 と既に2回も書いておきながらなんですが、
設定ファイルを読み込んで 標準出力するだけのサンプルなんて何の役にも立たない...
と言うことで、今回は 読み込んだ設定を アプリケーションのプロパティファイルに
展開してみることに...
結局 build.gradle はこんな感じになりました...
defaultTasks 'clean', 'build' apply plugin: 'java' if (!hasProperty('env')) { env = System.env['GRADLE_ENV'] ?: 'development' } { -> def slurper = new ConfigSlurper() slurper.binding = project.properties def files = files("environment/default.gradle", "environment/${env}.gradle", "${System.properties['user.home']}/.gradle/environment.gradle") def config = files.inject(new ConfigObject()) { config, file -> file.exists() ? config.merge(slurper.parse(file.toURL())) : config } // Project#properties にセット config.each { k, v -> setProperty k, v } }() // Project#properties を リソースに展開 processResources { expand (properties) } // プロパティ 出力 build << { println file("${sourceSets.main.classesDir}/Application.properties").text }
前回との違いは
- 読み込んだ設定ファイルの内容を Project#properties に設定するようにした
- processResources タスクで Application.properties をコピーする際に Project#properties を展開するようにした
- build タスク で Application.properties の内容を標準出力するようにした
読み込んだ設定ファイルの内容を Project#properties に設定すると
println config.server.urlではなく
println server.urlのようにアクセスできるようになって 、ちょっとだけいい感じになります。
Application.properties に Project#properties を展開するには build.gradle に
processResources { expand(project.properties) }を追加して (もちろん "<<" はいりません) Application.properties に
server.url = ${server.url} database.driverClassName = ${database.driverClassName} database.url = ${database.url} database.username = ${database.username} database.password = ${database.password}のように記述するだけです。
プロパティファイルの書き方は Ant でプロパティ展開する場合とほとんど同じです。
実際に実行してみると
$ ./gradlew -p server.url: http://app:8080/setting database.driverClassName: org.hsqldb.jdbcDriver database.url: jdbc:hsqldb:mem:devDB database.username: bluepapa32 database.password:のように ちゃんと Application.properties にプロパティ展開されて標準出力されます。
もし、興味のある方は
https://github.com/bluepapa32/gradle-environment-sample/tree/20110315にサンプルがありますので試してみてください。