Как сгенерировать код с помощью 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)

Спасибо и привет.

Ваш вопрос довольно широкий в его нынешнем виде. Вероятно, вам нужно будет 1) обработать классы во входной банке, возможно, используя отражение, 2) создать промежуточную модель на основе шага 1, 3) сгенерировать код на основе модели с помощью KotlinPoet, 4) скомпилировать сгенерированный код, 5) упаковать скомпилированный код в банку. Начните изучать их и задавайте более конкретные вопросы, если таковые имеются. Что касается KotlinPoet, он определенно поможет с генерацией кода, но другие шаги выходят за рамки библиотеки.

Egor 19.12.2018 21:45

Спасибо за ответ, но если мой проект - это всего лишь библиотека и у него нет основного класса, как мне выполнить генерацию кода? Например, если у вас есть этот код в классе GenerateCode.kt "FileSpec.builder (" "," HelloWorld "). AddType (TypeSpec.classBuilder (" Greeter ") ....... build ()" Как можно Я выполняю этот класс, когда выполняю "gradle build", или это то, что нельзя сделать?

TioCoding 19.12.2018 21:56

Мне приходит в голову создать класс с основным методом, который выполняет создание классов (GenerateCode.kt), но я хотел бы оптимизировать этот шаг при создании моего приложения с помощью 'gradle build'. Создание классов, методов и всего остального несложно, так как по Kotlinpoet очень много документации. Что вызывает у меня проблемы, так это знать, в какой части я запускаю генерацию класса (GenerateCode.kt) для проекта, который представляет собой просто библиотеку, как в предыдущем примере.

TioCoding 19.12.2018 21:59
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
"DevOps: Jenkins & AWS Series, часть 5: Установка Gradle на Ubuntu 22.04
В этой статье блога мы проведем вас через процесс установки Gradle на Ubuntu 22.04, интеграции его с Jenkins и создания задания Gradle. Мы...
2
3
1 126
1

Ответы 1

На мой взгляд, в документации КотлинПоэт нет примеров того, как интегрировать его в проект.

Как упомянул @Egor, вопрос сам по себе довольно широкий, поэтому я отвечу только на основную часть: как сгенерировать код с помощью КотлинПоэт, когда я создаю свое приложение с помощью Gradle?

Я сделал это с помощью пользовательские задачи Gradle.

Где-то в SRC / основной / Java / ком / бизнес / пакет / 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.

Любое решение для проектов, использующих плагин для приложений Android? Построение Gradle останавливается, когда он пытается получить доступ к runtimeClasspath

Tamim Attafi 24.02.2021 13:28

Другие вопросы по теме