微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Jetpack Proto数据存储-使用Kotlin DSL进行Gradle配置

如何解决Jetpack Proto数据存储-使用Kotlin DSL进行Gradle配置

在jetpack数据存储中,您必须set the gradle plugin task才能从.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'
                }
            }
        }
    }
}

在我的项目中,我的gradle项目使用了 Kotlin dsl 。在尝试将其转换为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 **
                }
            }
        }
    }
}

解决方法

要使用 Jetpack原型数据存储,请对 Gradle Kotlin Dsl

使用以下代码
// top of file
import com.google.protobuf.gradle.*


plugins {
    id("com.google.protobuf") version "0.8.12"
    // ...
}

dependencies {
  // ...
  implementation("com.google.protobuf:protobuf-javalite:3.10.0")
  implementation("androidx.datastore:datastore:1.0.0-alpha03")
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.10.0"
    }
    generateProtoTasks {
        all().forEach { task ->
            task.plugins{
                create("java") {
                    option("lite")
                }
            }
        }
    }
}
,

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

它按预期工作。

,

您也可以使用内置函数。

generateProtoTasks {
    all().forEach { task ->
        task.builtins {
            id("java") {
                option("lite")
            }
        }
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。