同时为Kotlin/Java和Kotlin/JS编译?

jjjwad0x  于 2023-02-13  发布在  Kotlin
关注(0)|答案(2)|浏览(178)

我想用Kotlin编写一些代码,这样基于JVM的后端和基于JS的前端都可以使用它。
要执行前者(使用新的IR编译器),必须使用@JsExport注解类,但是,如果我尝试为JVM使用build相同的文件,它会中断,因为该注解无法识别。
(这些是具有独立Gradle配置的独立项目,但链接到相同的Kotlin源代码树。它 * 不是 * 单个“多平台”构建。

  • 如何在导出Kotlin/JS的同时仍然与Kotlin/Java兼容?*
eiee3dmh

eiee3dmh1#

要实现这种分离和可重用性,您需要三个相互依赖的gradle子模块
1.共享“模块。具有公共代码的模块
1.后端模块。纯粹的Kotlin/jvm模块
1.前端模块。一个纯粹的Kotlin/js模块
您的gradle项目结构应如下所示

project-root
  - shared
    - src/commonMain/kotlin
    - build.gradle.kts
  - backend
    - src/main/kotlin
    - build.gradle.kts
  - frontend
    - src/main/kotlin
    - build.gradle.kts
  - settings.gradle.kts

shared/build.gradle.kts应如下所示

plugins {
  kotlin("multiplatform")
}

然后backend/build.gradle.kts

plugins {
  kotlin("jvm")
}

kotlin {
  sourceSets {
     val main by getting {
         dependencies {
             implementation(projects(":shared"))
         }
     }

  }
}

然后backend/build.gradle.kts

plugins {
  kotlin("js")
}

kotlin {
  sourceSets {
     val main by getting {
         dependencies {
             implementation(projects(":shared"))
         }
     }

  }
}

然后settings.gradle.kts

include(":shared",":backend",":frontend")

通过这种安排,您可以在shared/src/commonMain/kotlin中编写共享代码,并在它们各自的backendfrontend子模块上编写环境特定的代码
注意:已尽量减少上述Gradle配置,以缩小说明范围

1cklez4t

1cklez4t2#

@JsExport注解可以正常工作,前提是您位于 common 源集中。
我举了一个简单的例子:https://github.com/SimonCJacobs/JsExportExample
运行Gradle任务“jsRun”或“jvmRun”,查看在两个平台中使用JS IR编译器的@JsExport。

相关问题