Closed1
gradle.properties を BuildConfig に渡すやつ試作
前準備
android {
buildFeatures {
buildConfig = true // これが必要
}
}
コード
build.gradle.kts に追加
interface BindPropertyScope {
fun stringConfigField(name: String, default: String = "")
fun booleanConfigField(name: String, default: Boolean = false)
fun stringResource(name: String, default: String = "")
}
fun VariantDimension.bindProperty(configure: BindPropertyScope.() -> Unit) {
object: BindPropertyScope {
override fun stringConfigField(name: String, default: String) {
val value = (project.properties[name] as? String) ?: default
buildConfigField("String", name, "\"$value\"")
}
override fun booleanConfigField(name: String, default: Boolean) {
val value = (project.properties[name] as? String)?.toBoolean() ?: default
buildConfigField("Boolean", name, value.toString())
}
override fun stringResource(name: String, default: String) {
val value = (project.properties[name] as? String) ?: default
resValue("string", name, value)
}
}.configure()
}
使い方
android {
// ..
defaultConfig {
// ...
bindProperty {
stringConfigField("FOO_TOKEN")
booleanConfigField("FOO_ENABLED", default = true)
stringResource("BAR_URL")
}
}
}
解説
- VariantDimension は defaultConfig, ApplicationBuildType, ApplicationBuildFlavor で実装されるインターフェイスで、 buildConfigField, resValue などが定義されている
- VariantDimension.bindProperty:
- 拡張関数 にすることで呼び出す場所を制限するのと、this が VariantDimension になるのでそこから buildConfigField などを参照できるようにする
- configure: BindPropertyScope.() -> Unit:
- レシーバー付き関数リテラル というやつで、これを使うとラムダの中でのみ呼び出せるメソッドを作れたりする
NOTE
- Release ビルドのときにプロパティが読み込めなかったら例外飛ばす感じにしたい
- 現状 BuildType をビルド実行時にとる方法が不明
- あんまり頑張るところでもないので難しそうならいいかなみたいな気持ちがある
- プラグインにしたほうが綺麗か?
- dsl の拡張みたいな感じだがどうやる?
- あんまり頑張るところでもないので(以下略)
このスクラップは2023/11/10にクローズされました