Kotlin 多平台(Android、桌面)中的 GRPC

问题描述 投票:0回答:1

我正在创建一个 Jetbrains Compose 多平台项目。但我只需要 Desktop (JVM) 和 Android,所以有两个 JVM 目标。我想提取出需要 grpc 的逻辑,这样 Android 和 Desktop 都可以使用它,而无需我对其进行两次编程。

我似乎无法找到将 grpc/proto 绑定到项目中的方法,以便我可以编写一次逻辑并在 android 和桌面之间共享它。 这就是我的公共项目的 build.gradle.kts 的样子:

plugins {
    id("com.android.library")
    kotlin("multiplatform")
    id("org.jetbrains.compose")

}

kotlin {
    android()
    jvm("desktop")

    sourceSets {
        named("commonMain") {
            dependencies {
                api(compose.runtime)
                api(compose.foundation)
                api(compose.material)
                api(compose.ui)
                implementation(compose.preview)
                implementation(compose.uiTooling)
            }
        }
    }
}

android {
    compileSdk = 31

    defaultConfig {
        minSdk = 21
        targetSdk = 31
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }

    sourceSets {
        named("main") {
            manifest.srcFile("src/androidMain/AndroidManifest.xml")
            res.srcDirs("src/androidMain/res")
        }
    }
}

我尝试将我的原型绑定到源集中,但无法使其工作。


我的另一种方法: 接下来,我尝试创建第二个子模块,其中原型和逻辑将被绑定,但我也无法使其工作: 这是共享逻辑的 build.gradle.kts:

import com.google.protobuf.gradle.*
import org.gradle.kotlin.dsl.proto

plugins {
    kotlin("jvm")

    idea

    id("com.google.protobuf")
}

version = "unspecified"

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib"))
    api(project(":kotlin-common")) {
        exclude(group = "io.grpc", module = "grpc-protobuf")
        exclude(group = "io.grpc", module = "grpc-stub")
    }

    implementation("io.grpc:grpc-okhttp:${Versions.GRPC}")
    api("com.google.protobuf:protobuf-java-util:${Versions.PROTOBUF}")

    api("io.grpc:grpc-stub:${Versions.GRPC}")
    api("io.grpc:grpc-protobuf-lite:${Versions.GRPC}")
    api("io.grpc:grpc-kotlin-stub:${Versions.GRPC_KOTLIN}")
    api("com.google.protobuf:protobuf-kotlin-lite:${Versions.PROTOBUF}")

    api("io.insert-koin:koin-core:${Versions.KOIN}")
    api("org.jetbrains.kotlinx:kotlinx-coroutines-core:${Versions.COROUTINES}")
}

sourceSets {
    main {
        proto {
            srcDirs("../protos/src/main")
        }
    }
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:${Versions.PROTOBUF}"
    }

    plugins {
        id("java") {
            artifact = "io.grpc:protoc-gen-grpc-java:${Versions.GRPC}"
        }

        id("grpc") {
            artifact = "io.grpc:protoc-gen-grpc-java:${Versions.GRPC}"
        }
        id("grpckt") {
            artifact = "io.grpc:protoc-gen-grpc-kotlin:${Versions.GRPC_KOTLIN}:jdk7@jar"
        }
    }
    generateProtoTasks {
        all().forEach {
            it.plugins {
                id("grpc") {
                    option("lite")
                }
                id("grpckt") {
                    option("lite")
                }
            }

            it.builtins {
                id("kotlin") {
                    option("lite")
                }
            }
        }
    }
}

这是 kotlin-common 的 build.gradle.kts:

plugins {
    kotlin("jvm")
}

version = "1.0.0"

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib"))

    implementation("io.grpc:grpc-stub:${Versions.GRPC}")
}

这里出现分辨率错误,我尝试修复但无法弄清楚要排除的内容:

Duplicate class com.google.protobuf.AbstractMessageLite found in modules jetified-protobuf-java-3.19.1 (com.google.protobuf:protobuf-java:3.19.1) and jetified-protobuf-javalite-3.19.1 (com.google.protobuf:protobuf-javalite:3.19.1)
Duplicate class com.google.protobuf.AbstractMessageLite$Builder found in modules jetified-protobuf-java-3.19.1 (com.google.protobuf:protobuf-java:3.19.1) and jetified-protobuf-javalite-3.19.1 (com.google.protobuf:protobuf-javalite:3.19.1)
Duplicate class com.google.protobuf.AbstractMessageLite$Builder$LimitedInputStream found in modules jetified-protobuf-java-3.19.1 (com.google.protobuf:protobuf-java:3.19.1) and jetified-protobuf-javalite-3.19.1 (com.google.protobuf:protobuf-javalite:3.19.1)
...
android grpc android-jetpack-compose kotlin-multiplatform jetbrains-compose
1个回答
0
投票

有一个票有类似的问题,但与 stdlib 相关: https://youtrack.jetbrains.com/issue/KT-54136/Duplicated-classes-cause-build-failure-if-a-dependency-to-kotlin-stdlib-specified-in-an-android-project

因此,如果问题仍然存在,创建 YouTrack 票证始终是一个不错的选择:

https://youtrack.jetbrains.com/newIssue

© www.soinside.com 2019 - 2024. All rights reserved.