Я работаю над плагином Gradle для android, который должен программно установить аргумент для процессора аннотаций. "-AoutputDir=my.path.to.output.dir"
.
Итак, из функции Gradle Plugin apply()
я ссылаюсь на все подпроекты и с помощью Android gradle plugin 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 get переоценен? Можно ли настроить это с помощью кода, а не сценария сборки?
Заранее спасибо.