Kotlin Multiplatform 上的 KSP 在 kspJs 上失败,"Collection has more than one element."



我正在试验KSP(Kotlin符号处理(,看看它的功能,并试图让它在Kotlin多平台项目中工作。当我只启用kspJvm时,它工作得很好,一旦我也启用了kspJs,它就会失败,并显示"集合有多个元素">

我在这个演示github项目中重新创建了这个问题:https://github.com/janvladimirmostert/observable-demo

处理器中,我有以下配置:

build.gradle.kts

val kspVersion: String by project
group = "io.jvaas"
plugins {
kotlin("multiplatform")
}
kotlin {
jvm {
compilations.all {
kotlinOptions.jvmTarget = "11"
}
}
sourceSets {
val commonMain by getting
val jvmMain by getting {
dependencies {
implementation("com.google.devtools.ksp:symbol-processing-api:$kspVersion")
}
}
}
}

梯度属性

kotlinVersion=1.6.0
kspVersion=1.6.0-1.0.1

src/commonMain/kotlin/io/jvaas/noserve/可观测。kt

package io.jvaas.observe
annotation class Observable

src/jvmMain/resources/META-INF/services/com.google.devtools.ksp.processing.SymbolProcessorProvider

io.jvaas.observe.ObservableProcessorProvider

src/jvmMain/kotlin/io/jvaas/noserve/ObservableProcessor.kt

class ObservableProcessor(
val codeGenerator: CodeGenerator,
val logger: KSPLogger,
) : SymbolProcessor {
...
}
class ObservableProcessorProvider : SymbolProcessorProvider {
override fun create(
environment: SymbolProcessorEnvironment
): SymbolProcessor {
return ObservableProcessor(environment.codeGenerator, environment.logger)
}
}

在我的消费者中,我有以下内容:

import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackOutput.Target.UMD
group = "com.od"
plugins {
application
id("com.google.devtools.ksp") version "1.6.0-1.0.1"
kotlin("plugin.serialization")
kotlin("multiplatform")
id("com.github.johnrengelman.shadow")
}

kotlin {
jvm {
compilations.all {
kotlinOptions.jvmTarget = "11"
}
}
js(IR) {
browser {
binaries.executable()
webpackTask {
output.libraryTarget = UMD
}
}
}
sourceSets {
val commonMain by getting {
dependencies {
val serializationVersion = "1.3.1"
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$serializationVersion")
implementation("io.jvaas:jvaas-observe")
}
}
val commonTest by getting
val jvmMain by getting {
dependencies {

}
}
val jvmTest by getting {
dependencies {
implementation(kotlin("test-junit"))
}
}
val jsMain by getting

val jsTest by getting {
dependencies {
implementation(kotlin("test-js"))
}
}
}
}
dependencies {
add("kspJvm", "io.jvaas:jvaas-observe")
// add("kspJs", "io.jvaas:jvaas-observe") // <--- fails if enabled
//ksp("io.jvaas:jvaas-observe")
}
application {
mainClassName = "com.od.demo.Main"
}

applications/od-server/src/commonMain/kotlin.com/od/demo/Blah.kt

package com.od.demo
import io.jvaas.observe.Observable
@Observable
class Blah {
var test1: String = ""
var test2: Int = 0
var test3: Array<String> = arrayOf()
}

kspJvm选项被启用并在上正确输出文件时,这将得到正确处理

applications/od-server/build/engenerated/ksp/jvmMain/kotlin.com/od/demo/BlahO.kt

如果我为kspJs启用它,它将失败

add("kspJs", "io.jvaas:jvaas-observe")

Execution failed for task ':applications:od-server:compileProductionExecutableKotlinJs'.
> Failed to calculate the value of task ':applications:od-server:compileProductionExecutableKotlinJs' property 'entryModule$kotlin_gradle_plugin'.
> Collection has more than one element.

我已经尝试了常见的gradle构建--info/-debug/-scan,但不清楚从哪里开始解决这个问题。

如上所述,我做了一个演示项目来演示错误:https://github.com/janvladimirmostert/observable-demo

关于如何解决这个错误有什么想法吗?

问题已在中修复https://github.com/google/ksp/issues/744但我不确定它是否已经发布。

相关内容

最新更新