Androidx Proto 数据存储 gradle 设置
Androidx Proto datastore gradle setup
我正在尝试使用 Kotlin DSL (build.gradle.kts) 在 gradle 中配置的 protobuf 支持来获取新的 (alpha) android 数据存储。第一次尝试不会从存在的 xxx.proto(虚构名称)文件生成任何 java 源 类。 protobuf 插件正在生成正确的 android 任务,但是 运行 它们什么也不生成,所以显然默认设置没有找到我的初始 xxx.proto 文件所在的目录。现有文档是精简 gradle 设置,尤其是对于 Kotlin Gradle DSL(到目前为止 google 中的大多数 gradle 文档都是针对 groovy),以及我最初的尝试定义 xxx.proto 文件的位置无效。
是否有人拥有或曾见过使用 Kotlin (build.gradle.kts) 为 .proto 文件指定自定义源目录的 gradle 配置?
经过一些实验和挣扎后它可以正常工作,但涉及黑客攻击。如果有人可以提出改进建议,我们将不胜感激。如果这很有用,这里是工作设置中的配置片段。模块是具有 android、ios64 和 jvm 目标的 kotlin 1.4.21-2 多平台,还有更多计划。它具有源目录的 KMP 默认设置:
.proto 文件位于 src/androidMain/proto 子目录中。
build.gradle.kts 片段如下。所有更改都在 android
块中,当然除了插件:
plugins {
id("com.android.library")
kotlin("multiplatform")
id("kotlinx-atomicfu")
kotlin("plugin.serialization") version Versions.kotlinVersion
id("com.google.protobuf") version "0.8.14"
}
...
kotlin {
... no changes here
}
...
android {
...
sourceSets {
...
getByName("main") {
manifest.srcFile("src/androidMain/AndroidManifest.xml")
java.srcDirs("src/androidMain/kotlin")
assets.srcDirs(File("src/commonMain/resources"))
withGroovyBuilder {
"proto" {
"srcDir" ("src/androidMain/proto")
}
}
}
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:4.0.0-rc-2"
}
plugins {
id("javalite") { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" }
}
generateProtoTasks {
all().forEach { task ->
task.builtins {
id("java") {
option("lite")
}
}
task.plugins{
}
}
}
}
dependencies {
api("com.google.protobuf:protobuf-javalite:4.0.0-rc-2")
implementation("androidx.datastore:datastore:1.0.0-alpha05")
...
}
}
请注意 android 源集中的 withGroovyBuilder
hack - 插件需要 srcdir 定义才能找到我拥有的 .proto 文件,但在当前版本的插件中我不能'不知道正确的 Kotlin DSL 语法。似乎插件需要定义一个 Kotlin 扩展函数来使它更好地工作。
如果数据存储可以使用 kotlinx.serialization 提供的 protobuf 序列化而不是需要这些东西,并且跳过 gradle 中的这个 java 代码生成步骤,那就太好了] 全部一起。但我确信那是在路上...
无论如何,如果有人有改进等,请提前致谢...
我正在尝试使用 Kotlin DSL (build.gradle.kts) 在 gradle 中配置的 protobuf 支持来获取新的 (alpha) android 数据存储。第一次尝试不会从存在的 xxx.proto(虚构名称)文件生成任何 java 源 类。 protobuf 插件正在生成正确的 android 任务,但是 运行 它们什么也不生成,所以显然默认设置没有找到我的初始 xxx.proto 文件所在的目录。现有文档是精简 gradle 设置,尤其是对于 Kotlin Gradle DSL(到目前为止 google 中的大多数 gradle 文档都是针对 groovy),以及我最初的尝试定义 xxx.proto 文件的位置无效。
是否有人拥有或曾见过使用 Kotlin (build.gradle.kts) 为 .proto 文件指定自定义源目录的 gradle 配置?
经过一些实验和挣扎后它可以正常工作,但涉及黑客攻击。如果有人可以提出改进建议,我们将不胜感激。如果这很有用,这里是工作设置中的配置片段。模块是具有 android、ios64 和 jvm 目标的 kotlin 1.4.21-2 多平台,还有更多计划。它具有源目录的 KMP 默认设置:
.proto 文件位于 src/androidMain/proto 子目录中。
build.gradle.kts 片段如下。所有更改都在 android
块中,当然除了插件:
plugins {
id("com.android.library")
kotlin("multiplatform")
id("kotlinx-atomicfu")
kotlin("plugin.serialization") version Versions.kotlinVersion
id("com.google.protobuf") version "0.8.14"
}
...
kotlin {
... no changes here
}
...
android {
...
sourceSets {
...
getByName("main") {
manifest.srcFile("src/androidMain/AndroidManifest.xml")
java.srcDirs("src/androidMain/kotlin")
assets.srcDirs(File("src/commonMain/resources"))
withGroovyBuilder {
"proto" {
"srcDir" ("src/androidMain/proto")
}
}
}
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:4.0.0-rc-2"
}
plugins {
id("javalite") { artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0" }
}
generateProtoTasks {
all().forEach { task ->
task.builtins {
id("java") {
option("lite")
}
}
task.plugins{
}
}
}
}
dependencies {
api("com.google.protobuf:protobuf-javalite:4.0.0-rc-2")
implementation("androidx.datastore:datastore:1.0.0-alpha05")
...
}
}
请注意 android 源集中的 withGroovyBuilder
hack - 插件需要 srcdir 定义才能找到我拥有的 .proto 文件,但在当前版本的插件中我不能'不知道正确的 Kotlin DSL 语法。似乎插件需要定义一个 Kotlin 扩展函数来使它更好地工作。
如果数据存储可以使用 kotlinx.serialization 提供的 protobuf 序列化而不是需要这些东西,并且跳过 gradle 中的这个 java 代码生成步骤,那就太好了] 全部一起。但我确信那是在路上...
无论如何,如果有人有改进等,请提前致谢...