GRPC в мультиплатформенной версии Kotlin (Android, Настольный компьютер)

#android #grpc #android-jetpack-compose #kotlin-multiplatform #jetbrains-compose

Вопрос:

Я создаю мультиплатформенный проект Jetbrains Compose. Но мне понадобятся только рабочий стол (JVM) и Android, так что две цели JVM. Я хочу исключить логику, которая нуждается в grpc, чтобы и Android, и настольный компьютер могли использовать ее без необходимости программировать ее дважды.

Кажется, я не могу придумать способ привязки моего 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")  }  }  }  } }  

Here is the build.gradle.kts for 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) ...