在创建 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 任务 | 代码示例 )