Gradle Kotlin DSL 替换令牌

Gradle Kotlin DSL Replace Token

在我的代码中有 const val VERSION = $version.
我想用 build.gradle.kts.
中的真实版本字符串替换 $version 我该怎么做?

工作示例here

一种方法是使用模板文件(存储在 src 树之外)。我们称它为 TemplateVersion.kt:

class Version() {
    val version = "__VERSION";
}

然后在 build.gradle.kts 中,作为 compileKotlin 任务的初始部分,我们从 TemplateVersion.kt:

生成 Version.kt
val sourceFile = File(rootDir.absolutePath + "/resources/TemplateVersion.kt")
val propFile = File(rootDir.absolutePath + "/gradle.properties")
val destFile = File(rootDir.absolutePath + "/src/main/kotlin/${targetPackage}/Version.kt")

tasks.register("generateVersion") {
    inputs.file(sourceFile)
    inputs.file(propFile)
    outputs.file(destFile)

    doFirst {
        generateVersion()
    }
}

tasks.named("compileKotlin") {
    dependsOn("generateVersion") 
}

fun generateVersion() {
    val version: String by project
    val rootDir: File by project

    val inputStream: InputStream = sourceFile.inputStream()

    destFile.printWriter().use { out -> 
        inputStream.bufferedReader().forEachLine { inputLine ->
            val newLine = inputLine.replace("__VERSION", version)
            out.println(newLine) 
        }
    }

    inputStream.close()
}

其中 gradle.properties 是:

version=5.1.50

Version.kt 添加更多字段非常容易,例如构建时间戳。

(编辑: 这已更新为适当的 generateVersion 任务,该任务将检测对 gradle.properties 的更改。compileKotlin 任务将调用此任务)。