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