У меня есть некоторый код Kotlin в проекте библиотеки Gradle, и я хочу сгенерировать дополнительный код Kotlin, используя самоанализ исходного кода (поэтому его необходимо сначала скомпилировать). Процесс запускается функцией main() в исходном коде. Затем вновь сгенерированный код также должен быть скомпилирован, и оба скомпилированных вывода должны вместе попасть в выходной jar.
У меня пока так:
sourceSets {
generated {
kotlin {
srcDir "src/generated/kotlin"
}
compileClasspath += main.output + configurations.runtimeClasspath
runtimeClasspath += main.output
}
}
task generateCode(type: JavaExec) {
classpath = sourceSets.main.runtimeClasspath
mainClass = "com.something.CodeGenMainKt"
doFirst {
file("src/generated/kotlin").mkdirs()
}
dependsOn compileKotlin
}
task compileGeneratedKotlin(type: KotlinCompile) {
source = sourceSets.generated.kotlin
dependsOn generateCode
}
jar {
dependsOn compileGeneratedKotlin
from sourceSets.main.output
from sourceSets.generated.output
}
Но получите эту ошибку:
A problem occurred evaluating root project 'biz-kotlin'.
> Could not create task ':compileGeneratedKotlin'.
> Could not create task of type 'KotlinCompile'.
> Unable to determine constructor argument #1: missing parameter of type KotlinJvmCompilerOptions, or no service of type KotlinJvmCompilerOptions.
Почему я не могу/как добавить дополнительный этап компиляции? А остальная часть сценария выглядит нормально?
Согласно этому комментарию, нам нужно использовать kotlin.target.compilations.create
для создания пользовательской задачи компиляции Kotlin. Сохраняя остальную часть вашего build.gradle
как есть, задача compileGeneratedKotlin
, реализованная, как показано ниже, работает для меня.
kotlin.target.compilations.create("compileGeneratedKotlin") { it ->
it.source(sourceSets.generated)
}
tasks['compileGeneratedKotlin'].dependsOn(generateCode)
При этом созданный мною тестовый файл Kotlin компилируется и включается в сгенерированный файл jar.