将Gradle子项目与Kotlin多平台一起使用
我正在使用Kotlin多平台(JVM&JS),它在IDEA中创建了三个项目:将Gradle子项目与Kotlin多平台一起使用,kotlin,gradle,kotlin-multiplatform,gradle-dependencies,kmm,Kotlin,Gradle,Kotlin Multiplatform,Gradle Dependencies,Kmm,我正在使用Kotlin多平台(JVM&JS),它在IDEA中创建了三个项目:demo、demo-JS和demo-JVM 我想将通用代码拆分为更多的子项目/子模块。假设我添加了commonmod;如何使其编译 对于gradle run-p demo jvm,当前的错误是: demo/demo-js/src/main/kotlin/demo/commonmod/example.kt: (3, 12): Actual function 'getPlatform' has no correspondin
demo
、demo-JS
和demo-JVM
我想将通用代码拆分为更多的子项目/子模块。假设我添加了commonmod
;如何使其编译
对于gradle run-p demo jvm
,当前的错误是:
demo/demo-js/src/main/kotlin/demo/commonmod/example.kt: (3, 12): Actual function 'getPlatform' has no corresponding expected declaration
但我认为我这样做从根本上是错误的,因为我不知道什么应该取决于什么(尽管我尝试了很多迭代)。如果我解决了这个错误,我会得到其他错误,然后再得到其他错误,直到我回到这个错误
作为一个最小但仍然较大的项目,我有: 演示/设置.gradle: demo/build.gradle: 演示/演示jvm/settings.gradle: 演示/演示jvm/build.gradle: demo/demo js/settings.gradle: demo/demo js/build.gradle: 演示/commonmod/settings.gradle: demo/commonmod/build.gradle:
这花费了大量的时间,所以我希望这对某人有用 Github上有一个功能示例: 有几个消息来源帮助了我,但很多都是反复试验,所以如果有什么不好的做法,请让我知道
对于最小的示例,结构如下所示:
├── 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
通用模块(alpha
和beta
)需要每个平台的平台模块至少有一个“build.gradle”
settings.gradle
文件导入所有模块,包括平台模块
依赖关系,例如从alpha到beta,在公共alpha模块和所有alpha平台模块中声明
我学到了一些模式:
- 每个“普通”(通用)模块都有一个平台模块用于每个平台
- 对于公共模块
,javascript平台模块必须被称为alpha
(类似于alpha js
)-jvm
- 如果没有特定于平台的代码,则该模块可以只是目录中的一个gradle文件
- 平台模块可以方便地放在公共模块目录中(因此
)alpha:alpha-js
- 通用模块不应指平台模块;平台模块有一个依赖项
expectedbyproject(“\u common\u module”)
- 如果模块
依赖于alpha
,则beta
必须具有alpha
依赖项{compile project(“:beta”)}
必须具有alpha-js
(除了依赖项{compile project(“:beta:beta-js”)}
)expectedBy
必须具有alpha-jvm
(除了依赖项{compile project(“:beta:beta-jvm”)}
)等expectedBy
- 只有顶部模块具有设置.gradle,其中包括所有子模块(包括平台子模块)
- 确保名称正确,因为不正确的名称不会导致错误,它们只是默默地失败。(这似乎很可笑,但我想这是有原因的。)
- 不要将所有的输出放在一个共享的构建目录中——这会导致一些奇怪的非确定性错误
我以前在这里有完整的配置文件,但最好只检查代码,因为它非常长。对于来自谷歌搜索的任何人: “实际函数/类/伴随对象/等没有相应的预期声明”
尝试清理和重建项目,对我来说,这揭示了许多其他错误,这些错误阻止了构建。子模块必须在源集的依赖范围内声明。如果子模块是在公共源集中定义的,则不需要在特定平台中定义,反之亦然 build.gradle.kts(:kmm\u共享:功能\u a) 这样,android源集就不必包含依赖项
GL非常感谢您的指导,您为我节省了很多时间。我认为,我们应该创建一个特性请求来支持两个公共模块之间的“编译项目(“…”)”依赖关系。你知道已经有了吗?我不知道one@Andi您不能在
beta-common
中使用编译项目(':alpha-common')
?至少可以使用编译“some.groupid:some.artifactid:1.0.0”
这是关键信息:“依赖关系,例如从alpha到beta,在公共alpha模块和所有alpha平台模块中声明。”我可能会晚到@SimonForsberg参加聚会,但是,我有一个关于你问题的答案“您不能在beta common中使用compile project(':alpha common')”“。是的,您可以,但当您将依赖项添加到公共模块时,请将相应的平台特定模块添加到您的公共模块的平台特定实际版本中。希望这对某人有所帮助我不知道这是否仍然与您相关,但包含了一个完整的示例,其中包含了您可能需要的所有提示。似乎很有趣,特别是当第10个问题将得到解决时,谢谢!我是在寻找那个错误时发现这一点的。错误的意思是编译器找不到非平台特定的函数/类等,实际的
函数/类是平台特定的实现。
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')
}
rootProject.name = 'demo'
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"
}
rootProject.name = 'demo'
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"
}
rootProject.name = 'demo'
include 'demo-jvm', 'demo-js'
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')
}
├── 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
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
api(project(":kmm_shared:domain"))
}
}
}