Gradle で環境ごとに構成を変更する その2

こんな大変なときになんですが...
何もしないよりは 自分にできることを続けていこう!!

と言うことで...
id:fumokmm さんから ConfigSlurper で複数の設定ファイルの内容を マージする方法を教えてもらったので、今回は 環境ごとの構成を

  1. デフォルト設定 environment/default.gradle
  2. 環境毎の設定 environment/${env}.gradle
  3. ユーザ毎の設定 ${user.home}/.gradle/environment.gradle
といった複数のファイルで設定できるようにしてみました。

build.gradle はこんな感じ...

if (!hasProperty('env')) {
    env = System.env['GRADLE_ENV'] ?: 'development'
}
config = {
    def slurper = new ConfigSlurper()
    slurper.binding = project.properties

    def files = files("environment/default.gradle",
                  "environment/${env}.gradle",
                  "${System.properties['user.home']}/.gradle/environment.gradle")

    files.inject(new ConfigObject()) { config, file ->
        file.exists() ? config.merge(slurper.parse(file.toURL())) : config
    }
}()

inject で設定ファイルを順番に読み込み、ConfigObject#merge(ConfigObject) でマージするようにしてみました。
ConfigObject#merge(ConfigObject) は 引数の ConfigObject の方が優先されるようなので 優先度の低いファイルから読み込みます。
Groovy を使えば、たったこれだけ...
とっても便利ですね。

で実際これで何ができるようになったのかと言うと...
例えば、こんな感じでデータベースの設定ができるようになります。

environment/default.gradle

共通的な設定を書きましょう。
database {
    driverClassName = "org.hsqldb.jdbcDriver"
    username = 'bluepapa32'
    password = ''
}

environment/${env}.gradle

各環境毎の設定を書きましょう。
# deveropment.gradle

database {
    url = "jdbc:hsqldb:mem:devDB"
}
# test.gradle

database {
    url = "jdbc:hsqldb:mem:testDB"
}
# production.gradle

database {
    driverClassName = "oracle.jdbc.driver.OracleDriver"
    url = "jdbc:oracle:thin:dbserv:1521:prodDB"
}

production 環境の ${user.home}/.gradle/environment.gradle

バージョン管理できないような 個人設定やパスワード等の機密情報を書きましょう。
database {
    password = 'secret'
}

各環境で実行してみると...

$ ./gradlew -q
server.url: http://app:8080/setting
database.driverClassName: org.hsqldb.jdbcDriver
database.url: jdbc:hsqldb:mem:devDB
database.username: bluepapa32
database.password: 

$ ./gradlew -q -Penv=test
server.url: http://app/setting
database.driverClassName: org.hsqldb.jdbcDriver
database.url: jdbc:hsqldb:mem:testDB
database.username: bluepapa32
database.password: 

$ ./gradlew -q -Penv=production
server.url: https://app/setting
database.driverClassName: oracle.jdbc.driver.OracleDriver
database.url: jdbc:oracle:thin:dbserv:1521:prodDB
database.username: bluepapa32
database.password: secret
のような感じで構成を変更できます。

もし、興味のある方は

https://github.com/bluepapa32/gradle-environment-sample/tree/20110314
にサンプルがありますので試してみてください。