Я разрабатываю СПА с Kotlin (Ktor) на бэкэнде. Структура проекта сейчас:
.
├── frontend/ <-- SPA frontend source project
│ ├── dist/ <-- current webpack dist
│ ├── node_modules/ <-- not to be included in the jar
│ ├── src/ <-- to be bundled by webpack
│ │ └── index.js
│ ├── index.html <-- to be served as static by backend
│ ├── package.json <-- not to be included in the jar
│ └── webpack.config.json <-- not to be included in the jar
│
├── src/ <-- SPA backend source
| └── main/
| ├── kotlin/
| | └── Main.kt <-- backend entry point
| └── resources/ <-- framework-specific configuration
│
├── build.gradle
└── settings.gradle
Интерфейс успешно компилируется с cd frontend && npm run build
, сохраняя полученный пакет в frontend/dist
.
Настройка маршрутизации Ktor:
fun Application.main() {
install(DefaultHeaders)
install(CallLogging)
routing {
static("/") {
default("frontend/index.html") // to be replaced with index file
// from packaged frontend
}
// ... other dynamic routes for REST
}
}
build.gradle довольно стандартен:
buildscript {
ext.kotlin_version = '1.2.41'
ext.ktor_version = '0.9.2'
ext.koin_ktor_version = '0.9.2'
ext.ktor_gson_version = '0.9.2'
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}
group 'org.root_talis'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'application'
mainClassName = 'MainKt'
kotlin { experimental { coroutines "enable" } }
repositories {
mavenCentral()
jcenter()
maven { url "https://dl.bintray.com/kotlin/ktor" }
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
compile "io.ktor:ktor-server-netty:$ktor_version"
compile "io.ktor:ktor-gson:$ktor_gson_version"
compile "ch.qos.logback:logback-classic:1.2.1"
compile "org.koin:koin-ktor:$koin_ktor_version"
}
compileKotlin {
kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
kotlinOptions.jvmTarget = "1.8"
}
Как заставить Gradle скомпилировать проект внешнего интерфейса через npm run build
и упаковать dist
в получившийся JAR-файл для обслуживания бэкэндом?
Есть ли рекомендации по организации таких проектов?