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

时间:2016-01-25 17:59:38

标签: gradle kotlin

我想使用单独的shared项目共享服务器(JVM)和客户端(JS)之间的一些代码。我已经看过使用Maven的solution,但我不确定如何将其转换为Gradle项目。此外,official guide中没有共享项目的任何示例。那么,具有这种设置的最小build.gradle怎么样呢?

2 个答案:

答案 0 :(得分:4)

为了完整性,这是我与热键同时创建的设置:

主要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手册以获取自定义源目录)。

答案 1 :(得分:2)

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

可以使用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