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

问题描述 投票:1回答:1

我目前正在编写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编译器?谢谢。

android gradle kapt
1个回答
0
投票

[不幸的是,它没有得到很好的记录,我之前曾遇到过这个特殊问题。这是我所做的

在您的插件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)
}

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

快乐编码!

© www.soinside.com 2019 - 2024. All rights reserved.