0

我正在尝试使用 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")
            }
        }
    }
}

gradle.properties

kotlinVersion=1.6.0
kspVersion=1.6.0-1.0.1

src/commonMain/kotlin/io/jvaas/observe/ Observable.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/observe/ 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选项并正确输出文件时,这将被正确处理

应用程序/od-server/build/generated/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 build --info / --debug / --scan 但不清楚我可以从哪里开始寻找解决这个问题。

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

关于如何解决该错误的任何想法?

4

1 回答 1

0

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

于 2021-12-22T11:41:13.493 回答