首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Kotlin多平台一起使用分级子项目

与Kotlin多平台一起使用分级子项目
EN

Stack Overflow用户
提问于 2018-01-10 19:15:28
回答 3查看 4.9K关注 0票数 11

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

我想将公共代码分成更多的子项目/子模块。假设我添加了commonmod;如何使其编译?

现在,对于gradle run -p demo-jvm,错误是:

代码语言:javascript
复制
demo/demo-js/src/main/kotlin/demo/commonmod/example.kt: (3, 12): Actual function 'getPlatform' has no corresponding expected declaration

但是我认为我这样做是完全错误的,因为我不知道什么应该取决于什么(尽管我尝试了一些迭代)。如果我解决了这个错误,我会得到其他的,然后是其他的,直到我回到这个错误。

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

演示/设置.分级

代码语言:javascript
复制
rootProject.name = 'demo'

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

演示/build.gradle

代码语言:javascript
复制
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/setings.gradle

代码语言:javascript
复制
rootProject.name = 'demo'

演示/演示-jvm/build.gradle

代码语言:javascript
复制
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/setings.gradle

代码语言:javascript
复制
rootProject.name = 'demo'

演示/演示-js/build.gradle

代码语言:javascript
复制
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"
}

演示/通用/设置。

代码语言:javascript
复制
rootProject.name = 'demo'

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

演示/通用/build.gradle

代码语言:javascript
复制
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(':demo-js')
    compile project(':demo-jvm')
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-01-11 19:53:59

这花了大量的时间,所以我希望这对某人是有用的!

有一个关于Github的功能示例:演示

有几个来源提供了帮助,但很多都是反复尝试,所以如果有什么不好的练习,请告诉我!

对于最小的例子,结构如下:

代码语言:javascript
复制
├── 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模块和所有alpha平台模块中声明依赖项(例如从alpha到beta )。

我学到了一些模式:

  • 每个“普通”(公共)模块对于每个平台都有一个平台模块。
  • 对于通用模块alpha,javascript平台模块必须称为alpha-js (类似于-jvm)。
  • 如果没有特定于平台的代码,这个模块可以只是目录中的一个gradle文件。
  • 平台模块可以方便地放置在公共模块目录(so alpha:alpha-js)中。
  • 公共模块不应该引用平台模块;平台模块有一个依赖的expectedBy project(":the_common_module")
  • 如果模块alpha依赖于beta,那么
代码语言:javascript
复制
- `alpha` must have `dependencies { compile project(":beta") }`
- `alpha-js` must have `dependencies { compile project(":beta:beta-js") }` (in addition to `expectedBy`)
- `alpha-jvm` must have `dependencies { compile project(":beta:beta-jvm") }` (in addition to `expectedBy`) etc

  • 只有顶部模块有settings.gradle,它包含所有子模块(包括平台模块)。
  • 确保名称正确,因为不正确的名称不会导致错误,它们只是默默地失败。(这听起来很荒谬,但我想这是有原因的。)
  • 不要将所有的输出放在一个共享的构建目录中--这会导致一些奇怪的不确定错误。

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

票数 14
EN

Stack Overflow用户

发布于 2018-10-09 04:03:30

对于任何来自Google搜索的人来说:

“实际函数/类/同伴对象/等没有相应的预期声明”

尝试清理和重建的项目,对我来说,这揭示了许多其他的错误,是阻止建设。

票数 0
EN

Stack Overflow用户

发布于 2020-12-08 22:13:16

子模块必须在依赖关系范围内由sourceSets声明。如果子模块是在公共sourceSet中定义的,则不需要在特定平台中定义子模块,反之亦然。

build.gradle.kts (:kmm_shared:feature_a)

代码语言:javascript
复制
kotlin {
    sourceSets {
        val commonMain by getting {
            dependencies {
                api(project(":kmm_shared:domain"))
            }
        }
}

因此,没有必要在android sourceSet中也包含依赖项。

总帐

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48194556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档