我目前正在编写Gradle插件,以将一些参数注入注释处理器。在基于Java的Android项目中使用annotationProcessor
时,它可以正常工作。当我在基于Kotlin的项目中尝试kapt
时,它没有用,因为kapt
从其自己的配置中收集了args。
我到目前为止所做的:
val args = variant.javaCompileOptions.annotationProcessorOptions.arguments
args["key"] = "value"
我知道kapt
args传递是,您可以通过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)
}
现在在您的注释处理器中,只需声明对这些选项的兴趣指定相同的键!非常重要。
快乐编码!