【问题标题】:using kotlinx serialization inside a gradle plugin that creates a gradle task在创建 gradle 任务的 gradle 插件中使用 kotlinx 序列化
【发布时间】:2021-12-16 00:21:18
【问题描述】:

我正在尝试创建一个 gradle 插件,该插件将从可以在另一个项目中运行的 gradle 任务生成文件(从数据类序列化)。 假设我正在序列化的类标有一些注释@Annot,并且我在 gradle 任务中找到了所有具有反射的相关类(我确保依赖 kotlin compile 以便创建二进制文件)。问题是当我尝试使用时

val clazz: Class<*>
clazz.kotlin.serializer()

我得到一个 Serializer for class 'Type' is not found.(类型是我找到的实际类,并用 @Serializable@Annot 注释。 我正在使用 gradle 版本 7.2,kotlin 1.5.21(也尝试使用 1.5.31) 使用该插件的项目启用了 kotlinx 序列化插件 我错过了什么?为什么我无法使用 gradle 任务访问类序列化程序?

注意*如果我在目标项目中运行上述代码(而不是在插件中,那么serializer() 函数不会引发异常

【问题讨论】:

  • 有趣。我怀疑这与kotlinx.serialization 依赖编译器插件来生成序列化程序和serializer() 功能这一事实有关。我猜在 Gradle 执行生命周期的这一点上,编译器插件还没有运行。
  • 所以插件在编译运行后运行?我们知道是否有运行插件的 gradle 任务吗?只是想知道

标签: kotlin gradle-plugin kotlinx.serialization


【解决方案1】:

所以这并没有按照我想要的方式工作,但我找到了一种让它工作的方法。 我定义了一个扩展JavaExec任务的任务:

tasks.create(createFilesTaskName, JavaExec::class.java) {
        mainClass.set("package.of.file.SchemaKt")
        classpath = sourceSets.getByName("main").runtimeClasspath
        group = groupName
}

SchemaKt 中的代码位于我的 kotlin 源代码集中,或者位于当前项目所需的包中。 serializer() 可以从那里访问和工作,我可以从 gradle 任务中运行模式创建,这正是我所需要的。

我希望这对将来的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    • 2016-09-22
    相关资源
    最近更新 更多