やりたいこと
ビルド時にgradle
から値を埋め込んだKotlin
ファイルを生成し、それをソースとして扱います。
実際に生成したかったのは、以下のようなファイルです。
文字列で設定されている"2.15.2-beta0"
などの値はgradle
から埋め込んだものです。
package io.github.projectmapk.jackson.module.kogera
import com.fasterxml.jackson.core.Version
import com.fasterxml.jackson.core.util.VersionUtil
public val kogeraVersion: Version = VersionUtil.parseVersion("2.15.2-beta0", "io.github.projectmapk", "jackson-module-kogera")
やり方
これから紹介する方法は以下の方法を参考に独自の改修を加えたものです。
自分はこの辺りに詳しくないため、より良いやり方などご存じでしたらコメント頂けると嬉しいです。
成果物(build.gradle.kts
)は以下の通りです。
移行の解説は、この成果物からの抜粋をベースに行います。
1. ファイルを生成するタスクを定義する
まず、以下のようにしてファイルを生成するタスクを定義します。
val generatedSrcPath = "$buildDir/generated/kotlin"
/* 略 */
tasks {
// Task to generate version file
val generateKogeraVersion by registering(Copy::class) {
val packageStr = "$groupStr.jackson.module.kogera"
from(
resources.text.fromString(
"""
package $packageStr
import com.fasterxml.jackson.core.Version
import com.fasterxml.jackson.core.util.VersionUtil
public val kogeraVersion: Version = VersionUtil.parseVersion("$version", "$groupStr", "${rootProject.name}")
""".trimIndent()
)
) {
rename { "KogeraVersion.kt" }
}
into(file("$generatedSrcPath/${packageStr.replace(".", "/")}"))
}
/* 略 */
}
generateKogeraVersion
としている部分はタスクの名前で、ここには任意の名前を付けられます。
resources.text.fromString
の中身は生成結果となる文字列です。
ここでgradle
タスクのスコープに定義された値を読み取り、埋め込んでいます。
rename
に設定した値がファイル名、into
に設定した値が生成先ディレクトリとなります。
生成先ディレクトリに関しては、基本的にbuild/generated
の下とすることがお勧めです。
サンプルコードではbuild/generated/kotlin
の下としていますが、既存で生成を行っている場合そのディレクトリに合わせるのも手です。
ここまで設定したタスクを実行することで、ファイル生成を行えます。
2. 生成したファイルをソースに加える
1で生成したファイルは、そのままではKotlin
上でソースとして扱われません(既にソースとして認識されているディレクトリへ生成した場合を除く)。
そこで、以下のようにしてソースに加える必要が有ります。
val generatedSrcPath = "$buildDir/generated/kotlin"
/* 略 */
kotlin {
/* 略 */
sourceSets["main"].apply {
kotlin.srcDir(generatedSrcPath)
}
}
3. ビルドに連動して自動生成する
以下のように、1で定義したタスクをcompileKotlin
の依存に追加することで、ビルドの前に自動実行することが出来ます。
tasks {
/* 略 */
compileKotlin {
dependsOn.add(generateKogeraVersion)
/* 略 */
}
/* 略 */
}