如何在我的 gradle 插件中动态地将参数传递给 kapt 编译器?

How to pass arguments to kapt compiler dynamicly inside my gradle plugin?

我目前正在编写一个 Gradle 插件来向注释处理器注入一些参数。在基于 Java 的 Android 项目中使用 annotationProcessor 时效果很好。当我在基于 Kotlin 的项目中尝试 kapt 时,它没有工作,因为 kapt 从它自己的配置中收集了参数。

到目前为止我做了什么:

val args = variant.javaCompileOptions.annotationProcessorOptions.arguments
args["key"] = "value"

我对 kapt 参数传递的了解是,您可以通过其在 build.gradle、link 中的扩展来设置它们:

kapt {
    arguments {
        arg("key", "value")
    }
}

那么如何在我的 gradle 插件中动态地将参数传递给 kapt 编译器?谢谢。

不幸的是,它没有得到很好的记录,我之前已经 运行 解决过这个问题。这是我做的

在您的插件 apply 函数中执行此操作(目标是应用插件的 gradle 项目)。如果您将插件应用到您的根项目中,那么只需将相同的代码放入 target.subProjects{...}

target.afterEvaluate{
    target.plugins.all {
        when (it) {
            is AppPlugin -> {
                extensions[AppExtension::class].run {
                    configureJavaCompilerArguments("option1", "option2")
                }
            }
            //if your project has a library that requires/use kapt also do this
            is LibraryPlugin -> {
                extensions[LibraryExtension::class].run {
                    configureJavaCompilerArguments("option1", "option2")
                }
            }
         }
    }
}

为简单起见,我声明了一个花哨的扩展函数来添加参数

fun BaseExtension.configureJavaCompilerArguments(option1:String, option2: String) {
    with(defaultConfig.javaCompileOptions.annotationProcessorOptions) {
        includeCompileClasspath = true
        arguments(mapOf(
                "some.key.in.your.ap.1" to option1,
                "some.key.in.your.ap.2" to option2
        ))
    }
}

还有这个我从 Butter-knife 源代码

中获取的奇特函数
internal operator fun <T : Any> ExtensionContainer.get(type: KClass<T>): T {
    return getByType(type.java)
}

现在在您的注解处理器中只需声明对这些选项的兴趣指定相同的键!!这非常重要。

编码愉快!