javascript - 使用 Gradle 在 IntelliJ 中具有多个源集的 2 个项目的未解决依赖关系
问题描述
我正在尝试在 Gradle 中为 JS 和 JVM 使用一个通用的 Kotlin 源集和 2 个特定的源集。我知道有一个kotlin-multiplatform
插件,但我想尝试是否可以进行这样的设置。它通过gradle
从命令行运行来工作,但 IntelliJ 抱怨在 JS 或 JVM 项目中(从不同时)它无法找到公共类。
我的目录结构如下:
- 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")
}
虚拟机
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 中,无法为其中 1 个项目解析 MyLibrary()。它是哪个项目取决于我先打开哪个项目。如果我首先打开 JsDemo,则 JvmDemo 会出现问题,反之亦然。
知道是什么导致了这个问题吗?
解决方案
IntelliJ IDEA 在很大程度上依赖于一个事实,即单个源文件只能分析一次,作为单个模块的一部分和单个上下文(平台、依赖项、语言设置等)。如果该假设不成立,它仍然会分析一次源文件,并且不会对包含该文件的其他模块执行此操作。这会导致你得到的行为。不支持在多个 IDE 模块中包含单个源文件。
Kotlin 多平台项目通过实际分析一次源代码来解决这个问题,但使用适当的上下文告诉 IDE 平台和预期-实际匹配。这是在平台之间共享代码的推荐方式。
推荐阅读
- jquery - 猫头鹰轮播自动播放速度
- google-chrome-extension - 如何在扩展中测试 Chrome onUpdateAvailable
- javascript - 我需要将文本框名称传递到 AngularS 路由页面吗?
- java - 减少 Firestore Android 中的读取次数
- url - 从archive.org 的多个页面中提取URL?
- javascript - 如何获取句子中的第一个引用文本
- windows - 使用 jenkins 在本地运行 schtask
- r - 如何在箱线图异常值上水平使用抖动?
- python - 我的数据框有很多(192)列。如何一次选择两列?
- java - 在 JAVA 中解码谷歌翻译 API 响应