Как создать проект Gradle, который зависит от JS из проекта Kotlin?

#kotlin #gradle #kotlin-multiplatform #gradle-multi-project-build

Вопрос:

Я использую Kotlin для обмена логикой между моей серверной частью (Java Spring Web) и передней частью. Заставить серверную часть Java вызывать логику Kotlin легко: я сделал обе части одной и той же сборки мультипроекта Gradle, и проект сервера зависит от проекта Kotlin.

Теперь мне нужно вывести сгенерированный JavaScript из Kotlin в формат, в котором сервер может его обслуживать. Просматривая банку вывода Gradle для сервера, он содержит только банку jvm, а не банку js.

Ответ №1:

У меня была аналогичная проблема в этом проекте GitHub с бэкэндом Spring Boot и интерфейсом Kotlin/JS общий код.

Если все находится в одном и том же репозитории в нескольких подпроектах Gradle, вы можете использовать следующее в подпроекте сервера, чтобы объединить созданные JS в качестве ресурсов в jar вашего сервера:

 tasks.processResources {
    // make sure we build the frontend before creating the jar
    dependsOn(":frontend:assemble")
    // package the frontend app within the jar as static
    val frontendBuildDir = project(":frontend").buildDir
    val frontendDist = frontendBuildDir.toPath().resolve("distributions")
    from(frontendDist) {
        include("**/*")
        into("static")
    }
}
 

Это не идеально (мне не нравятся подобные зависимости между проектами), но это делает свою работу.

Затем Spring Boot автоматически обслуживает статические файлы из этого места в jar ( /static ).

Комментарии:

1. Также пришлось удалить kotlin.js.generate.executable.default=false из моей мультиплатформенной сборки Kotlin. Не знаю, почему мастер проекта поместил его туда.