Как сгенерировать код с KotlinPoet, когда я создаю свое приложение? (Gradle)
Я новичок в использовании kotlinpoet, и я читал документацию, и это похоже на отличную библиотеку, но я не смог найти пример, чтобы решить мою проблему.
У меня есть зависимость lib-domain-0.1.jar
в котором у меня есть бизнес-объекты, например:
package pe.com.business.domain
data class Person(val id: Int? = null, val name: String? = null)
...
..
package pe.com.business.domain
data class Departament(val id: Int? = null, val direction: String? = null)
...
..
.
И я хочу построить новую зависимость под названием lib-domain-fx-0-1.jar
где он имеет те же домены, но со свойствами JavaFx (например, с tornadofx):
package pe.com.business.domainfx
import tornadofx.*
class Person {
val idProperty = SimpleIntegerProperty()
var id by idProperty
val nameProperty = SimpleStringProperty()
var name by nameProperty
}
...
..
package pe.com.business.domainfx
import tornadofx.*
class Departament {
val idProperty = SimpleIntegerProperty()
var id by idProperty
val directionProperty = SimpleStringProperty()
var direction by directionProperty
}
...
..
.
У меня вопрос, как я могу сгенерировать эти файлы в lib-domain-fx-0-1.jar
просто скомпилировав мое приложение с помощью сборки gradle? Мой проект "lib-domain-fx-0-1.jar" - это просто библиотека, поэтому у него нет основного класса, поэтому я не знаю, с чего начать генерацию кода?. Я видел несколько примеров, в которых они используют @Annotations
и два разных модуля в одном проекте, но это не то, что мне нужно:(. Мне нужно конвертировать все классы lib-domain-0.1.jar
к версии JavaFx с TornadoFX в другом проекте (lib-domain-fx-0.1.jar
)
Спасибо и всего наилучшего.
0 ответов
На мой взгляд, в документации KotlinPoet нет примеров того, как интегрировать его в проект.
Как упоминал @Egor, вопрос сам по себе довольно широкий, поэтому я отвечу только на основную часть: как сгенерировать код с помощью KotlinPoet, когда я создаю свое приложение с помощью Gradle?
Я сделал это с помощью специальных задач Gradle.
Где-то в src / main / java/com/business/package/GenerateCode.kt есть приложение / библиотека / подпроект:
package com.business.package
import com.squareup.kotlinpoet.*
fun main() {
// using kotlinpoet here
// in the end wrap everything into FileSpec
val kotlinFile: FileSpec = ...
// and output result to stdout
kotlinFile.writeTo(System.out)
}
Теперь заставьте Gradle создать файл с произведенным выводом. Добавьте в build.gradle:
task runGenerator(type: JavaExec) {
group = 'kotlinpoet'
classpath = sourceSets.main.runtimeClasspath
main = 'com.business.package.GenerateCodeKt'
// store the output instead of printing to the console:
standardOutput = new ByteArrayOutputStream()
// extension method genSource.output() can be used to obtain the output:
doLast {
ext.generated = standardOutput.toString()
}
}
task saveGeneratedSources(dependsOn: runRatioGenerator) {
group = 'kotlinpoet'
// use build directory
//def outputDir = new File("/${buildDir}/generated-sources")
// or add to existing source files
def outputDir = new File(sourceSets.main.java.srcDirs.first(), "com/business/package")
def outputFile = new File(outputDir, "Generated.kt")
doLast {
if(!outputDir.exists()) {
outputDir.mkdirs()
}
outputFile.text = tasks.runGenerator.generated
}
}
В Android Studio / Intellij IDEA откройте окно инструмента Gradle, найдите новую группуkotlinpoet
(без group
задачи будут в others
раздел) и выполнить задачу saveGeneratedSources
.