Хранилище данных Jetpack proto — конфигурация gradle с Kotlin dsl

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