使用带有Kotlin多平台的Gradle子项目

时间:2018-01-10 19:15:29

标签: gradle kotlin gradle-dependencies kotlin-multiplatform

我正在使用Kotlin多平台(JVM& JS),它在IDEA中创建了三个项目:***demodemo-js

我想将公共代码拆分为更多子项目/子模块。假设我添加demo-jvm;我如何编译?

目前,commonmod的错误是:

gradle run -p demo-jvm

但我认为我从根本上做错了,因为我不知道应该依赖什么(虽然我尝试过一些迭代)。如果我解决了这个错误,我会得到其他的,然后是其他的,直到我回到这个。

作为一个最小但仍然很大的example,我有:

演示/ settings.gradle

demo/demo-js/src/main/kotlin/demo/commonmod/example.kt: (3, 12): Actual function 'getPlatform' has no corresponding expected declaration

演示/的build.gradle

rootProject.name = 'demo'

include 'demo-jvm', 'demo-js', 'commonmod'

演示/演示JVM / settings.gradle

buildscript { ... }

apply plugin: 'kotlin-platform-common'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-common:$kotlin_version"
    testCompile "org.jetbrains.kotlin:kotlin-test-annotations-common:$kotlin_version"
    testCompile "org.jetbrains.kotlin:kotlin-test-common:$kotlin_version"
    compile project(':commonmod')
}

演示/演示JVM /的build.gradle

rootProject.name = 'demo'

演示/演示JS / settings.gradle

buildscript { ... }

apply plugin: 'kotlin-platform-jvm'
apply plugin: 'application'

repositories {
    mavenCentral()
}

mainClassName = "demo.MainKt"

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    expectedBy project(":")
    testCompile "junit:junit:4.12"
    testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
    testCompile "org.jetbrains.kotlin:kotlin-test:$kotlin_version"
}

演示/演示JS /的build.gradle

rootProject.name = 'demo'

演示/ commonmod / settings.gradle

buildscript { ... }

apply plugin: 'kotlin-platform-js'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-js:$kotlin_version"
    expectedBy project(":")
    testCompile "org.jetbrains.kotlin:kotlin-test-js:$kotlin_version"
}

演示/ commonmod /的build.gradle

rootProject.name = 'demo'

include 'demo-jvm', 'demo-js'

3 个答案:

答案 0 :(得分:7)

这花了很多时间,所以我希望这对某人有用!

Github上有一个功能示例:kotlin_multiplatform_gradle_demo

有几个消息来源有帮助,但很多都是试错,所以如果有什么不好的做法,请告诉我!

对于最小的例子,结构是这样的:

├── alpha
│   ├── alpha-js
│   │   └── build.gradle
│   ├── alpha-jvm
│   │   └── build.gradle
│   ├── build.gradle
│   └── src
│       └── main
│           ├── kotlin
│           │   └── demo
│           │       └── alpha
│           │           └── main.kt
├── beta
│   ├── beta-js
│   │   ├── build.gradle
│   │   └── src
│   │       └── main
│   │           └── kotlin
│   │               └── demo
│   │                   └── beta
│   │                       └── platform.kt
│   ├── beta-jvm
│   │   ├── build.gradle
│   │   └── src
│   │       └── main
│   │           └── kotlin
│   │               └── demo
│   │                   └── beta
│   │                       └── platform.kt
│   ├── build.gradle
│   └── src
│       └── main
│           └── kotlin
│               └── demo
│                   └── beta
│                       └── platform.kt
├── build.gradle
└── settings.gradle

公共模块(alphabeta)需要每个平台的平台模块,至少需要一个`build.gradle``。

settings.gradle文件导入所有模块,包括平台模块。

依赖关系,例如来自alpha on beta,在公共alpha模块和所有alpha平台模块中声明。

我学到了一些模式:

  • 每个“普通”(通用)模块为每个平台都有一个平台模块。
  • 对于通用模块alpha,必须调用javascript平台模块alpha-js(类似于-jvm)。
  • 如果没有特定于平台的代码,则此模块可以只是目录中的gradle文件。
  • 平台模块可以方便地放在公共模块目录中(所以alpha:alpha-js)。
  • 通用模块不应该引用平台模块;平台模块具有依赖关系expectedBy project(":the_common_module")
  • 如果模块alpha取决于beta,那么

    • alpha必须dependencies { compile project(":beta") }
    • alpha-js必须dependencies { compile project(":beta:beta-js") }(除了expectedBy
    • alpha-jvm必须dependencies { compile project(":beta:beta-jvm") }(除expectedBy之外)等
  • 只有顶级模块有settings.gradle,其中包括所有子模块(包括平台模块)。

  • 确保正确的名称,因为不正确的名称不会导致错误,他们只是默默地失败。 (这似乎很荒谬,但我想有一个原因。)
  • 不要将所有输出放入单个共享构建目录中 - 这会导致几个奇怪的非确定性错误。

我以前在这里有完整的配置文件,但最好只检查Github上的代码,因为它真的很长。

答案 1 :(得分:0)

子模块必须在sourceSet的依赖范围内声明。如果子模块是在通用sourceSet中定义的,则无需在特定平台之一中定义子模块,反之亦然。

build.gradle.kts(:kmm_shared:feature_a)

kotlin {
    sourceSets {
        val commonMain by getting {
            dependencies {
                api(project(":kmm_shared:domain"))
            }
        }
}

有了这个,android sourceSet也不必包含依赖项。

GL

答案 2 :(得分:-1)

对于来自Google搜索的任何人

  

“实际功能/类/伴侣对象/等没有相应的预期声明”

尝试清理和重建项目,对我来说,这揭示了导致构建失败的许多其他错误。