#android #gradle-kotlin-dsl #android-jetpack-datastore
#Android #gradle-kotlin-dsl #android-jetpack-хранилище данных
Вопрос:
В хранилище данных jetpack вам необходимо установить задачу плагина gradle для создания класса из .proto
файлов:
// build.gradle
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.10.0"
}
// Generates the java Protobuf-lite code for the Protobufs in this project. See
// https://github.com/google/protobuf-gradle-plugin#customizing-protobuf-compilation
// for more information.
generateProtoTasks {
all().each { task ->
task.builtins {
java {
option 'lite'
}
}
}
}
}
В моем проекте я использую Kotlin dsl для своего проекта gradle. После попытки преобразовать это в kotlin dsl option
свойство неизвестно, и я не могу найти его альтернативу для kotlin kts
// build.gradle.kts
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.10.0"
}
generateProtoTasks {
all().forEach { task ->
task.builtins {
java {
option = "lite" // ** option is unknown **
}
}
}
}
}
Ответ №1:
Чтобы использовать хранилище данных Jetpack Proto, используйте следующий код для Gradle Kotlin DSL
// top of file
import com.google.protobuf.gradle.*
plugins {
id("com.google.protobuf") version "0.8.12"
// ...
}
val protobufVersion = "3.18.0"
dependencies {
// ...
implementation("com.google.protobuf:protobuf-javalite:$protobufVersion")
implementation("androidx.datastore:datastore:1.0.0-alpha03")
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:$protobufVersion"
}
generateProtoTasks {
all().forEach { task ->
task.plugins{
create("java") {
option("lite")
}
}
}
}
}
Комментарии:
1. работает для меня с последними версиями конца 2022 года
Ответ №2:
FWIW, принятый ответ направил меня на правильный путь, но при синхронизации произошел сбой со следующей ошибкой:
Unable to find method ''org.gradle.api.NamedDomainObjectContainer org.gradle.kotlin.dsl.NamedDomainObjectContainerExtensionsKt.invoke(org.gradle.api.NamedDomainObjectContainer, kotlin.jvm.functions.Function1)''
'org.gradle.api.NamedDomainObjectContainer org.gradle.kotlin.dsl.NamedDomainObjectContainerExtensionsKt.invoke(org.gradle.api.NamedDomainObjectContainer, kotlin.jvm.functions.Function1)'
Поэтому я заменил
task.plugins{
create("java") {
option("lite")
}
}
с
task.plugins.create("java") {
option("lite")
}
и это сработало, как и ожидалось.
Ответ №3:
Вы также можете использовать встроенные модули.
import com.google.protobuf.gradle.*
generateProtoTasks {
all().forEach { task ->
task.builtins {
id("java") {
option("lite")
}
}
}
}