在创建 gradle 任务的 gradle 插件中使用 kotlinx 序列化

Posted

技术标签:

【中文标题】在创建 gradle 任务的 gradle 插件中使用 kotlinx 序列化【英文标题】:using kotlinx serialization inside a gradle plugin that creates a gradle task 【发布时间】: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 任务吗?只是想知道 【参考方案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 任务中运行模式创建,这正是我所需要的。

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

【讨论】:

以上是关于在创建 gradle 任务的 gradle 插件中使用 kotlinx 序列化的主要内容,如果未能解决你的问题,请参考以下文章

Android Gradle 插件自定义 Gradle 任务 ③ ( Gradle 自定义任务创建方法 Project#task 函数 | Task#doFirst 函数用法 )

Android Gradle 插件自定义 Gradle 任务 ⑩ ( 自定义任务类继承 DefaultTask 类 | TaskContainer#create 函数创建任务 | 生成自定义任务)

Android Gradle 插件自定义 Gradle 任务 ⑩ ( 自定义任务类继承 DefaultTask 类 | TaskContainer#create 函数创建任务 | 生成自定义任务)

Android Gradle 插件Gradle 自定义 Plugin 插件 ⑤ ( 自定义插件中获定义方法 | 在插件中创建 Gradle 任务 | 代码示例 )

如何使用 Spring Boot“bootJar”插件创建 gradle 任务以生成爆炸性战争?

Android知识要点整理(21)----Gradle 之创建任务和插件