使用Gradle在Kotlin服务器和客户端项目之间共享代码

我想使用一个单独的shared项目来共享服务器(JVM)和客户端(JS)之间的一些代码。 我见过使用Maven的解决方案 ,但我不知道如何将其转换为Gradle项目。 另外, 官方指南中没有任何共享项目的例子。 那么,如何使用这样的设置最小的build.gradle

用另一个Kotlin项目的依赖来构建Kotlin2JS项目似乎需要以任何方式复制源代码。 一种方法是将Kotlin项目源代码添加到Kotlin2JS项目源代码集。

这可以通过project范围中的以下行来完成:

 sourceSets { main.kotlin.srcDirs += project(':shared').sourceSets.main.kotlin.srcDirs } 

请看整个项目结构:

 root/ shared/ src/main/kotlin build.gradle client/ src/main/kotlin server/ src/main/kotlin build.gradle settings.gradle 

settings.gradle

 include 'shared', 'server', 'client' 

并在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') } } 

请注意, shared项目应该包含自己的build.gradle

为了完整起见,这是我几乎与热键同时创建的设置:

主要settings.gradleinclude 'shared', 'client', 'server'

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') } } 

客户端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" } 

服务器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" } 

共享项目的build.gradle只包含apply plugin: 'kotlin' ,好吧,我不确定使用共享库是否简单(或者在很多情况下是必要的),所以我猜它甚至可以保持空白。

gradle client:build在服务器的静态资源文件夹中生成JavaScript文件。 gradle idea生成与正确链接的依赖项和源文件夹的IntelliJ项目(只要使用默认名称 – src/main/kotlin等;请参阅官方Kotlin Gradle手册以获取自定义源目录)。