Desidero condividere parte del codice tra il server (JVM) e il client (JS) utilizzando un progetto separato shared
. Ho visto un solution usando Maven, ma non sono sicuro di come convertirlo in un progetto Gradle. Inoltre, non ci sono esempi di progetti condivisi nello official guide. Quindi, come sarebbe un minimo build.gradle
con tale impostazione?Codice condiviso tra il server Kotlin ei progetti client utilizzando Gradle
risposta
Costruire un progetto Kotlin2JS con dipendenze da altri progetti Kotlin sembra richiedere la copia delle fonti in qualsiasi modo. Un modo per farlo è aggiungere le dir di origine del progetto Kotlin alle directory di origine del progetto Kotlin2JS.
Questo può essere fatto con le seguenti righe in project
campo di applicazione:
sourceSets {
main.kotlin.srcDirs += project(':shared').sourceSets.main.kotlin.srcDirs
}
Si prega di vedere l'intera struttura del progetto:
root/
shared/
src/main/kotlin
build.gradle
client/
src/main/kotlin
server/
src/main/kotlin
build.gradle
settings.gradle
In settings.gradle
:
include 'shared', 'server', 'client'
E in build.gradle
:
group 'com.example.multiproject'
version '1.0-SNAPSHOT'
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.0.0-beta-4589"
}
}
subprojects {
repositories {
mavenCentral()
}
}
project(':client') {
evaluationDependsOn(':shared')
apply plugin: 'kotlin2js'
compileKotlin2Js.kotlinOptions.sourceMap = true
compileKotlin2Js.kotlinOptions.outputFile = "${projectDir}/web/js/app.js"
compileKotlin2Js.kotlinOptions.suppressWarnings = true
compileKotlin2Js.kotlinOptions.verbose = true
sourceSets {
main.kotlin.srcDirs += project(':shared').sourceSets.main.kotlin.srcDirs
}
dependencies {
compile 'org.jetbrains.kotlin:kotlin-js-library:1.0.0-beta-4589'
}
}
project(':server') {
apply plugin: 'kotlin'
dependencies {
compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.0-beta-4589'
compile project(':shared')
}
}
Si noti che il progetto shared
deve contenere il proprio build.gradle
.
Per completezza, questa è la messa a punto che stavo creando praticamente in contemporanea con hotkey:
principale settings.gradle
: include 'shared', 'client', 'server'
principale build.gradle
:
buildscript {
ext {
kotlinVer = '1.0.0-beta-4589'
}
repositories {
mavenCentral()
maven {
url 'http://oss.sonatype.org/content/repositories/snapshots'
}
}
dependencies {
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVer"
}
}
allprojects {
apply plugin: 'idea'
group = 'some.company'
version = '0.0.1'
ext {
kotlinVer = '1.0.0-beta-4589'
// Lib versions go there.
}
repositories {
mavenLocal()
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven { url "https://oss.sonatype.org/content/repositories/releases/" }
}
}
project('shared') {
apply plugin: 'kotlin'
}
project('server') {
apply plugin: 'kotlin'
apply plugin: 'application'
mainClassName = 'some.company.Main'
dependencies {
compile project(':shared')
}
}
project('client') {
apply plugin: 'kotlin2js'
dependencies {
compile project(':shared')
}
}
Cliente build.gradle
:
apply plugin: 'kotlin2js'
compileKotlin2Js {
kotlinOptions.outputFile = "server/src/main/resources/static/js/app.js"
kotlinOptions.sourceMap = true
}
sourceSets {
main.kotlin.srcDirs += '../shared/src/main/kotlin'
// hotkey's solution:
// main.kotlin.srcDirs += project(':shared').sourceSets.main.kotlin.srcDirs
}
dependencies {
compile "org.jetbrains.kotlin:kotlin-js-library:$kotlinVer"
}
Server build.gradle
:
apply plugin: 'kotlin'
sourceCompatibility = 1.7
targetCompatibility = 1.7
dependencies {
// Libs go there.
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVer"
testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlinVer"
}
del progetto condiviso build.gradle
contiene solo apply plugin: 'kotlin'
e, beh, non sono sicuro se si usa librerie condivise è semplice (o necessario, in molti casi), quindi credo che potrebbe anche rimanere vuoto.
gradle client:build
genera il file JavaScript nella cartella delle risorse statiche del server. gradle idea
genera il progetto IntelliJ con dipendenze e cartelle di origine collegate correttamente (purché vengano utilizzati i nomi predefiniti - src/main/kotlin
, ecc., Consultare il manuale ufficiale di Kotlin Gradle per le directory di origine personalizzate).
Hai provato a utilizzare questa configurazione? Sapevo già come creare configurazioni multi-progetto, ma la cosa è - sembra che sia il server che il client dipendono da diversi plugin e librerie. Se sono corretto, il progetto client Kotlin dovrebbe usare il plugin 'kotlin2js' e' kotlin-js-library' invece del plugin 'kotlin' e' kotlin-stdlib'. Attualmente sto provando l'approccio multi-progetto, ma: A) quando si utilizza il plugin 'idea', IntelliJ non vede le cartelle di origine, quindi c'è molta configurazione manuale, B) se si importa come progetto Gradle, le dipendenze esterne non sono linked. Caricherò i miei script quando sono completamente bloccato. – JustACluelessNewbie
@JustACluelessNewbie, sono d'accordo, ho perso il momento JS.Potresti fornirmi una dipendenza del plugin kotlin2js per buildscript? Penso che sarà simile a quello che ho scritto, usando solo plugin diversi per progetti diversi invece di uno in "sottoprogetti". – hotkey
@JustACluelessNewbie, ho aggiornato la risposta. Questo buildscript viene configurato al mio fianco e sembra essere corretto, ma non so come verificare se 'client' costruisce correttamente. Si prega di verificare la versione corrente nel progetto. Tuttavia, sia 'client' che' server' sono in grado di usare classi da 'shared'. – hotkey