経緯
やりたかったこと
- アプリケーションで使う定数的な値を一括管理したい
- ProductFlavorごとにAPIの向き先など設定情報を変えたい
- それらを管理するためのクラスを自分で作りたくない
BuildConfigを使わない理由
- build.gradleが肥大化する
- 定数の記述が多少面倒
- いちいち型を記述しないといけないので面倒
- すべての値を文字列で埋め込むのも好みでない
Gradle Config Plugin
https://github.com/tmiyamon/gradle-config
特徴
- ProductFlavorごとにYamlを定義できる
- Yamlから値に参照するためのクラスが自動生成される
- 値の型はYamlの記述内容に合わせて自動的に解決してくれる
導入
buildscriptにプラグインを追加
buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "gradle.plugin.com.tmiyamon:gradle-config:0.2.1"
}
}
プラグインを適用する
アプリのプロジェクトがあるbuild.gradleに以下を追記
(app/build.config)
apply plugin: 'com.tmiyamon.config'
使い方
コンフィグファイルを作る
アプリのプロジェクトルートにconfig
ディレクトリを追加する
ファイル名は以下が対応している
config/default.yml
config/default_secret.yml
config/${productFlavor}.yml
config/${productFlavor}_secret.yml
config/${buildType}.yml
config/${buildType}_secret.yml
ProductFlavorに応じてこれらのファイルが適宜読み込まれて1つのクラスが生成される
*_seciet.yml
のファイルは秘匿情報を入れることができる。使う場合はバージョン管理下に置かないように.gitignore
に入れておくこと
Yamlに項目を埋めていく
あとはYamlを作っていくだけ
size: 2
server: google.com
section:
size: 3
servers: [ {name: yahoo.com}, {name: amazon.com} ]
このように記述するとビルド時にSettingsという名前のクラスが生成される
生成されたクラスはこのように値を参照できるようになっている
Settings.size // => 2
Settings.server // => google.com
Settings.section.size // => 3
Settings.section.servers.get(0).name // => yahoo.com
Settings.section.servers.get(1).name // => amazon.com
便利!!!😃
応用
kotlinの拡張を使って定数と引数を組み合わせた文字列を作る
例えばベースのURLだけYamlに書いておいて、パスの組み合わせをkotlinの拡張で実現する
url:
base: https://hoge.com
続いてkotlin側でプロパティを拡張する
fun Settings.Url.getDetail(id: String) = "$base/detail/$id"
こんな感じでアプリ上で参照できるようになる
Settings.url.getDetail("1") // => https://hoge.com/detail/1
あとがき
設定情報は何かと細かく組み合わせたり、たくさん記述したりする部分なので、管理しやすくしたい
このプラグインはそうした部分の要求を叶えてくれるよいアプローチに思えた
Top comments (2)
You can also use yamlonline.com/ for the yaml validator as well as yaml converter to json,csv,xml,base64 also for beautify and minify YAML.
Love you share a tool which helps to validate YAML data.
codebeautify.org/yaml-validator