Введение
Проект находится в Kotlin и строится с использованием Gradle . Я пытаюсь сгенерировать базовый класс данных с некоторой информацией о сборке, скажем, сейчас мне нужно, чтобы он генерировался каждый раз перед запуском.
Вот задание Gradle, которое у меня сейчас есть:
def generatedDir = "$buildDir/generated"
// noinspection GroovyAssignabilityCheck
task generateBuildInfo {
inputs.property "version", rootProject.version.toString()
inputs.property "name", rootProject.name.toString()
outputs.dir generatedDir
outputs.upToDateWhen { false }
doFirst {
def buildInfoFile = file("$generatedDir/BuildInfo.kt")
buildInfoFile.parentFile.mkdirs()
buildInfoFile.text = """
internal data class BuildInfo(
val version: String = "${project.version.toString() ?: "unspecified"}",
val name: String = "${project.name.toString() ?: "unspecified"}"
)
""".replace(" ", "").trim()
}
}
Чтобы решить эту проблему с помощью IntelliJ IDEA, я добавил свою новую папку в исходные коды проекта и, очевидно, связал зависимости следующим образом:
sourceSets.main.kotlin.srcDirs += generatedDir
project.afterEvaluate {
compileJava.dependsOn generateBuildInfo
compileKotlin.dependsOn generateBuildInfo
}
Все это делается в отдельном файле (чтобы не загрязнять мои основные скрипты). Из-за этой организации после применения плагинов я просто включаю генератор в свой основной скрипт, например:
apply from: "gradle/scripts/build-info-generator.gradle"
ПРОБЛЕМА
Похоже, код генератора выполняется только один раз, после запуска assemble
, когда я впервые запустил clean
на этом модуле. Это не то, что я хочу, потому что когда я изменяю некоторые свойства проекта (например, version
), источник не обновляется ... как если бы compileJava
/ compileKotlin
и моя пользовательская задача не выполнялась.
Они не отображаются в журналах сборки как выполненные.
Есть ли способ запустить эту задачу каждый раз, когда я хочу запустить модуль запуска моего модуля? Конечно, я могу сделать некоторое умное сравнение файлов, чтобы увидеть, нужно ли генерирование, но сейчас я просто хочу, чтобы это делалось каждый раз. Я что-то упустил?