Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Gradle在Kotlin服务器和客户端项目之间共享代码_Gradle_Kotlin - Fatal编程技术网

使用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
为了完整性,这是我几乎与热键同时创建的设置:

设置。渐变
包括“共享”、“客户端”、“服务器”

Main
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

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,好吧,我试过并得到了同样的答案,所以现在删除这个答案。请注意,这是一个非常老的问题,虽然答案可能仍然适用,但今天你应该研究一下。