使用Gradle在Kotlin服务器和客户端项目之间共享代码
我想使用一个单独的使用Gradle在Kotlin服务器和客户端项目之间共享代码,gradle,kotlin,Gradle,Kotlin,我想使用一个单独的shared项目在服务器(JVM)和客户端(JS)之间共享一些代码。我见过一个使用Maven的项目,但我不知道如何将其转换为Gradle项目。此外,在本文档中没有任何共享项目的示例。那么,一个最小的build.gradle如何使用这样的设置呢?构建一个依赖于另一个Kotlin项目的Kotlin2JS项目似乎需要以任何方式复制源代码。一种方法是将Kotlin项目源dirs添加到Kotlin2JS项目源集dirs 这可以通过项目范围中的以下行完成: sourceSets {
shared
项目在服务器(JVM)和客户端(JS)之间共享一些代码。我见过一个使用Maven的项目,但我不知道如何将其转换为Gradle项目。此外,在本文档中没有任何共享项目的示例。那么,一个最小的build.gradle
如何使用这样的设置呢?构建一个依赖于另一个Kotlin项目的Kotlin2JS项目似乎需要以任何方式复制源代码。一种方法是将Kotlin项目源dirs添加到Kotlin2JS项目源集dirs
这可以通过项目
范围中的以下行完成:
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
在设置.gradle
中:
include 'shared', 'server', 'client'
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')
}
}
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')
}
}
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"
}
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
中:
include 'shared', 'server', 'client'
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')
}
}
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')
}
}
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"
}
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"
}
请注意,
shared
项目应该包含自己的build.gradle
为了完整性,这是我几乎与热键同时创建的设置:
主设置。渐变:包括“共享”、“客户端”、“服务器”
Mainbuild.gradle
:
include 'shared', 'server', 'client'
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')
}
}
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')
}
}
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"
}
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
:
include 'shared', 'server', 'client'
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')
}
}
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')
}
}
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"
}
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
:
include 'shared', 'server', 'client'
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')
}
}
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')
}
}
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"
}
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插件:“kotlin”
,而且,我不确定使用共享库是否简单(或者在许多情况下是必要的),所以我猜它甚至可能保持为空
gradleclient:build
在服务器的静态资源文件夹中生成JavaScript文件gradle idea
生成具有正确链接的依赖项和源文件夹的IntelliJ项目(只要使用默认名称-src/main/kotlin
等;有关自定义源目录,请参阅官方kotlin gradle手册)。您尝试过使用此设置吗?我已经知道如何创建多项目设置,但问题是——服务器和客户端似乎都依赖于不同的插件和库。如果我是正确的,Kotlin客户端项目应该使用kotlin2js
插件和Kotlin js库
,而不是Kotlin
插件和Kotlin stdlib
。我目前正在尝试多项目方法,但是:A)当使用idea
插件时,IntelliJ看不到源文件夹,因此有很多手动设置;B)如果导入为Gradle项目,则外部依赖项不会链接。当我完全陷入困境时,我会上传我的脚本。@JustACluelessNewbie,我同意,我错过了JS时刻。你能为我提供一个构建脚本的kotlin2js插件依赖项吗?我认为它将类似于我所写的,只是在不同的项目中使用不同的插件,而不是在子项目中使用一个插件,我已经更新了答案。这个构建脚本是在我这边配置的,看起来是正确的,但我不知道如何检查client
构建是否正确。请检查项目中的当前版本。然而,client
和server
都可以使用shared
中的类。如果你想让客户端真正看到共享的源代码,JS插件是不够的,这是我开始的gradle客户端:生成
无法使用共享项目中的类编译客户端代码。而且,我认为,kotlin stdlib
只是JVM。在JS编译之前,我一直在努力完成一项附加共享源代码目录的任务,但我认为解决方案可以简单得多。我问这个问题是想看看是否有人已经找到了一个有效的解决方案——我不是一个完全的Gradle初学者。@JustACluelessNewbie,好吧,我试过并得到了同样的答案,所以现在删除这个答案。请注意,这是一个非常老的问题,虽然答案可能仍然适用,但今天你应该研究一下。