我正在使用Kotlin多平台(JVM& JS),它在IDEA中创建了三个项目:***
,demo
和demo-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'
答案 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
公共模块(alpha
和beta
)需要每个平台的平台模块,至少需要一个`build.gradle``。
settings.gradle
文件导入所有模块,包括平台模块。
依赖关系,例如来自alpha on beta,在公共alpha模块和所有alpha平台模块中声明。
我学到了一些模式:
alpha
,必须调用javascript平台模块alpha-js
(类似于-jvm
)。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中定义的,则无需在特定平台之一中定义子模块,反之亦然。
kotlin {
sourceSets {
val commonMain by getting {
dependencies {
api(project(":kmm_shared:domain"))
}
}
}
有了这个,android sourceSet也不必包含依赖项。
GL
答案 2 :(得分:-1)
对于来自Google搜索的任何人
“实际功能/类/伴侣对象/等没有相应的预期声明”
尝试清理和重建项目,对我来说,这揭示了导致构建失败的许多其他错误。