GRPC в мультиплатформенном Kotlin (Android, рабочий стол)

Я создаю многоплатформенный проект Jetbrains Compose. Но мне понадобится только рабочий стол (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 для shared-logic:

      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")
                }
            }
        }
    }
}

Вот build.gradle.kts для kotlin-common:

      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)
...

0 ответов

Другие вопросы по тегам