我正在尝试在 Gradle 中使用通用的 Kotlin 源代码集和 2 个用于 JS 和 JVM 的特定源代码集。我知道有一个 kotlin-multiplatform
插件,但我想尝试一下是否可以进行这样的设置。它通过从命令行运行 gradle
来工作,但 IntelliJ 提示说无论是在 JS 还是在 JVM 项目中(永远不会同时),它都找不到公共(public)类。
我的目录结构如下:
- common
- src/main/kotlin/MyLibrary.kt
- js
- build.gradle.kts
- src/main/kotlin/JsDemo.kt
- jvm
- build.gradle.kts
- src/main/kotlin/JvmDemo.kt
这里的Jsdemo和JvmDemo无非就是:
fun main() {
MyLibrary().sayHello()
}
构建脚本是这样的
JS
plugins {
id("kotlin2js") version "1.3.41"
}
repositories {
jcenter()
}
dependencies {
implementation(kotlin("stdlib-js"))
}
sourceSets["main"].withConvention(KotlinSourceSet::class) {
kotlin.srcDir("../common/src/main/kotlin")
}
JVM
plugins {
kotlin("jvm") version "1.3.41"
}
repositories {
jcenter()
}
dependencies {
implementation(kotlin("stdlib-jdk8"))
}
sourceSets {
main {
withConvention(KotlinSourceSet::class) {
kotlin.srcDir("../common/src/main/kotlin")
}
}
}
从命令行运行任务时,一切正常。但是,在 IntelliJ 中,无法为其中一个项目解析 MyLibrary()。具体是哪个项目,看我先开哪个。如果我先打开 JsDemo,那么 JvmDemo 就会出现问题,反之亦然。
知道是什么导致了这个问题吗?
最佳答案
IntelliJ IDEA 在很大程度上依赖于这样一个事实,即单个源文件只能作为单个模块的一部分在单个上下文(平台、依赖项、语言设置等)中分析一次。如果这个假设不成立,它仍然会分析一次源文件,并且不会对包含该文件的其他模块进行分析。这会导致您得到的行为。不支持在多个 IDE 模块中包含单个源文件。
Kotlin 多平台项目通过实际分析一次源代码来解决这个问题,但使用适当的上下文告诉 IDE 有关平台和期望-实际匹配的信息。这是在平台之间共享代码的推荐方式。
关于javascript - 使用 Gradle 在 IntelliJ 中使用多个源集的 2 个项目 Unresolved 依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57556627/