我正在使用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 corresponding expected declaration但是我认为我这样做是完全错误的,因为我不知道什么应该取决于什么(尽管我尝试了一些迭代)。如果我解决了这个错误,我会得到其他的,然后是其他的,直到我回到这个错误。
作为一个最小但仍然很大的示例,我有:
演示/设置.分级
rootProject.name = 'demo'
include 'demo-jvm', 'demo-js', 'commonmod'演示/build.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/setings.gradle
rootProject.name = 'demo'演示/演示-jvm/build.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/setings.gradle
rootProject.name = 'demo'演示/演示-js/build.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"
}演示/通用/设置。
rootProject.name = 'demo'
include 'demo-jvm', 'demo-js'演示/通用/build.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(':demo-js')
compile project(':demo-jvm')
}发布于 2018-01-11 19:53:59
这花了大量的时间,所以我希望这对某人是有用的!
有一个关于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模块和所有alpha平台模块中声明依赖项(例如从alpha到beta )。
我学到了一些模式:
alpha,javascript平台模块必须称为alpha-js (类似于-jvm)。alpha:alpha-js)中。expectedBy project(":the_common_module")。alpha依赖于beta,那么- `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上的代码,因为它真的很长。
发布于 2018-10-09 04:03:30
对于任何来自Google搜索的人来说:
“实际函数/类/同伴对象/等没有相应的预期声明”
尝试清理和重建的项目,对我来说,这揭示了许多其他的错误,是阻止建设。
发布于 2020-12-08 22:13:16
子模块必须在依赖关系范围内由sourceSets声明。如果子模块是在公共sourceSet中定义的,则不需要在特定平台中定义子模块,反之亦然。
build.gradle.kts (:kmm_shared:feature_a)
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
api(project(":kmm_shared:domain"))
}
}
}因此,没有必要在android sourceSet中也包含依赖项。
总帐
https://stackoverflow.com/questions/48194556
复制相似问题