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
にサンプルがありますので試してみてください。