首页 > 解决方案 > 使用来自 gradle 任务的 Android gradle 插件 dsl 设置参数

问题描述

我正在为 android 开发一个 gradle 插件,它必须以编程方式为注释处理器设置一个参数。"-AoutputDir=my.path.to.output.dir".

因此,从 gradle 插件apply()函数中,我引用了所有子项目并使用Android gradle 插件 dsl我尝试通过这样做来设置参数

private fun addAnnotationProcessorOptions(rootProject: Project, outDir: File) {
        rootProject.subprojects {
            it.also { project ->
                project.afterEvaluate {prj->
                    prj.plugins.all { plugin ->
                        when (plugin) {
                            is AppPlugin -> {
                                prj.extensions[AppExtension::class].run {
                                    defaultConfig.javaCompileOptions.annotationProcessorOptions.arguments(
                                            mapOf("outdir" to outDir.absolutePath)
                                    )
                                }
                            }

                            is LibraryPlugin -> {
                                prj.extensions[LibraryExtension::class].run {
                                    defaultConfig.javaCompileOptions.annotationProcessorOptions.arguments(
                                            mapOf("outdir" to outDir.absolutePath)
                                    )
                                }
                            }
                        }
                    }
                }
            }
        }
    }

翻译起来就像我在每个子项目的构建脚本上做的一样

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"


    defaultConfig {
        minSdkVersion 21
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        consumerProguardFiles 'consumer-rules.pro'
        //HERE is the same call to the same dsl object
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = ['outdir': 'path.to.output']
            }
        }
    }

当我尝试outdir在我的注释处理器中获取参数时,后者会抛出一个异常,抱怨outdir找不到参数。但是,如果我outdir从构建脚本中设置参数,它将毫无问题地选择它。

我不能从构建脚本中设置参数,因为我的用例要求这个配置应该以编程方式完成。

PS:我使用了Project.beforeEvaluate{}Project.afterEvaluate{}闭包,但仍然没有运气。

知道发生了什么吗?我的 dsl 配置被覆盖了吗?是否可以通过代码设置而不是构建脚本?

提前致谢。

标签: androidkotlingradleannotation-processing

解决方案


推荐阅读