👋

何とかcompose multiplatformで環境変数を隠す

2024/01/08に公開

前提

めちゃくちゃ知識が薄いところなので、ベストじゃないとは思うのですが
とりあえずできたやり方を共有します。

実は主目的の一つは、コメントでもっといいやり方を教えてもらうことなのでコメントいただけるとありがたいです。

あと、ビルド構成はktsでlibs.version.tomlでバージョンを管理している前提で行きます。
違う人は適宜読み替えてください。

やりたいこと

compose multiplatformで環境変数をgit上に上げないようにしたい。
ただ、適当なファイルを作ってやるやり方は汚いので避けたい。
.envみたいなやり方にしたい。

BuildKonfigを導入

強強エンジニアのYasuhiro SHIMIZUさんが作ってくれたBuildKonfigというライブラリを導入します。
libs.version.tomlに以下を追記

[versions]
konfig = "0.15.1"

[plugins]
konfig = { id = "com.codingfeline.buildkonfig", version.ref = "konfig" }

build.gradle.ktsに以下を追加

buildkonfig {
    packageName = "your.package.name"
    defaultConfigs{

    }
}

かけたらsyncしてください。

local.propertiesに使いたい変数を保存

local.propertiesならgitignoreで元々ignoreされているはずですが、一応確認してください。
適当に

tekitou.api.key = hogehoge

みたいな形式で保存してください。
hogehogeの部分にクオーテーションはいらないです。

build.gradle.kts側からlocal.propertiesを呼び出す

ここがなぜか詰まったんですが結局力技でコードを書いて解決しました。
以下の関数を追加してください。

fun <T: Any> propOfDef(propertyName: String, defaultValue: T): T {
    val props = Properties()
    try {
        FileInputStream("local.properties").use { props.load(it) }
    } catch (e: Exception) {
        println("Error reading local.properties: ${e.message}")
    }

    @Suppress("UNCHECKED_CAST")
    val propertyValue = props[propertyName] as? T
    return propertyValue ?: defaultValue
}

次に最初に追加したbuildkonfigの部分を以下のように修正してください。

buildkonfig {
    packageName = "your.package.name"
    defaultConfigs{
        buildConfigField(FieldSpec.Type.STRING, "hogehoge", propOfDef("tekitou.api.key","tekitou_default_value"))
    }
}

hogehogeの部分は呼び出す時のためのわかりやすい名前にしてください。

コード側から呼び出す

簡単です。

import your.package.name.BuildKonfig.hogehoge

すればそのままの名前で使えます。

Discussion