一般的に、Gradle ScriptやGradle Plugin上で外部からの設定値を取り扱う際は Gradle PropertiesやCommand-line flags、System Propertiesの仕組みを利用します。それらから参照される gradle.properties
ファイルは、言いなりのままに(誰の?)設定を追加し続けると、秘匿値と秘匿する必要のない値が混在してしまい、加えて近年Gradle Plugin側からビルドに必要なパラメータとしてGradle Propertiesに設定する事を要求されるシーンが増えてきた為、結果的に gradle.propeties
を編集する機会が増えてきて、開くたびに視界に入る秘匿値に溜息をついてきました。秘匿値は分離して管理したい。
最終的なゴールとしては AWS System Manager Parameter Storeのような外部の設定データ管理ストレージに載せる事になると思われますが、まずはミニマムスタートということで、環境変数にする事から始めます。
Gradleにおいて環境変数を参照する事は決して難しい事ではないですが、外の世界ではdotenvな文化があるので、これに追従する事にします。
まずは環境変数が存在しない場合 .env
ファイルの内容を見にいくGradle Pluginを作成します。
https://github.com/uzzu/dotenv-gradle
作成しました。
このpluginでは .env
または .env.template
ファイルに利用する環境変数名を定義しておくと自動でextension化され、Gradle build script上で簡単に参照できるようになります。
例えば環境変数 HOGE_API_KEY
を利用する場合、pluginを入れただけの状態では
env.isPresent("HOGE_API_KEY") // true or false
env.fetch("HOGE_API_KEY") // 存在しない場合は例外をスロー
env.fetch("HOGE_API_KEY", "default_value") // 存在しない場合引数の値を返却
env.fetchOrNull("HOGE_API_KEY") // 存在しない場合はnull
このように参照しますが、project rootに .env.template
, .env
に
HOGE_API_KEY=
な定義が存在していた場合
env.HOGE_API_KEY.isPresent // true or false
env.HOGE_API_KEY.value // 存在しない場合は例外をスロー
env.HOGE_API_KEY.orElse("default_value") // 存在しない場合は引数の値を返却
env.HOGE_API_KEY.orNull() // 存在しない場合はnull
このように参照できます。Gradle Kotlin DSLを利用していれば入力補完が効きます。
環境変数を参照する際の優先度は従来のdotenvに同じく、システムの環境変数 > .env
になっています。
という訳で、Dotenv Gradleを利用する事でGradle build script上で簡単に環境変数を取り扱えるようになりました。
この先:
.env.template
を予め用意しておく.env
が存在しなければ、.env.template
の変数定義をもとに外部の設定データ管理ストレージから値を参照して.env
を作成する
といった事が出来るようになると、今まで通り秘匿値がVCS管理化にない状態を維持しつつ、ビルドに必要な環境変数は .env.template
で網羅されており、Gradle build script上ではGradle Kotlin DSLを利用していれば入力補完も効いて便利、という状況になって良さそうですね。Android Studio 4.0からGradle Kotlin DSLがサポートされます。
※くれぐれも .env
はVCS管理下に置かないようにしましょう。