Gradle で環境ごとに構成を変更する その2
こんな大変なときになんですが...
何もしないよりは 自分にできることを続けていこう!!
と言うことで...
id:fumokmm さんから ConfigSlurper で複数の設定ファイルの内容を
マージする方法を教えてもらったので、今回は 環境ごとの構成を
- デフォルト設定 environment/default.gradle
- 環境毎の設定 environment/${env}.gradle
- ユーザ毎の設定 ${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にサンプルがありますので試してみてください。