基本上,当我在调试模式下组装时,我希望我的注释处理器插入某些调试逻辑,而在发布时,我希望生成的代码尽可能快地执行而无需额外检查。
如何为每种构建类型分别指定 kapt 的参数? 当然,我希望它像这样工作:
android {
buildTypes {
debug {
kapt {
arg("key", "value-for-debug")
}
}
debug {
kapt {
arg("key", "value-for-release")
}
}
}
}
但它不起作用,因为
kapt {}
是从 android {}
闭包中调用的,而不是从特定的 buildType
闭包中调用的,所以自然而然地,发布者获胜并被到处使用。
我怀疑我无法通过
kapt {}
调用解决我的问题,因为它确实是插件的全局变量。那么是否有另一种解决方法,比如为特定任务或其他东西指定参数?
好吧,事实证明,自从 Kotlin
1.7.0
以来,它实际上是可以实现的。在该版本中,KAPT 插件公开了一个公共任务接口——org.jetbrains.kotlin.gradle.tasks.Kapt
,它具有annotationProcessorOptionProviders
属性。该属性具有MutableList<Any>
的类型,但实际上它是MutableList<List<CommandLineArgumentProvider>>
.
所以,可以按照以下方式写一些东西:
// Somewhere in your build.gradle.kts
tasks.withType<Kapt> {
if (name.startsWith("kaptDebug")) {
annotationProcessorOptionProviders += listOf(CommandLineArgumentProvider {
listOf("key", "value-for-debug")
}
} else if (name.startsWith("kaptRelease")) {
annotationProcessorOptionProviders += listOf(CommandLineArgumentProvider {
listOf("key", "value-for-release")
}
}
}