【发布时间】:2020-08-20 17:32:38
【问题描述】:
我正在编写一个 gradle 插件来生成 Java 代码。我的插件生成基于 Android R 类的代码,因此它依赖于
processVariantResources
任务。在我的插件中,我使用这段代码来做到这一点:
class MyPlugin : Plugin<Project> {
override fun apply(project: Project) {
val extension = project.extensions.create<MyPluginExtension>(PLUGIN_NAME, MyPluginExtension::class.java)
project.tasks.whenTaskAdded { task ->
if (task.name.startsWith("process") && task.name.contains("Resources") && !task.name.contains("Test")) {
val index = task.name.indexOf("Resources")
val variantName = task.name.substring(7, index)
//Create my task and add it to the project, make it dependent on processResources
project.task("my${variantName}ResourceTask") {
it.doLast {
generateSomeCodeForVariant(project, extension, variantName)
}
taskList.add(it)
}.dependsOn(task)
}
}
project.afterEvaluate {
val appExtension = project.extensions.findByType(AppExtension::class.java)
appExtension?.applicationVariants?.all { variant ->
val myTask = project.tasks.getByName("my${variant.name.capitalize()}ResourcesTask")
val outputDir = "${project.buildDir}/generated/source/myplugin/${variant.name}"
//register my task as java generating
variant.registerJavaGeneratingTask(myTask, File(outputDir))
}
}
}
然后,在我使用这个插件的项目的 build.gradle 中,我添加了
android {
sourceSets {
main {
java.srcDirs += ['build/generated/source/myplugin']
kotlin.srcDirs += ['build/generated/source/myplugin']
}
}
}
我的插件实际上是生成源码到目录的:
build/generated/source/myplugin/com/mygroup/myartifact
无论如何,代码生成正确,并放置在正确的位置,但我无法让编译器识别我生成的代码。任何帮助将不胜感激。
【问题讨论】:
标签: java android kotlin code-generation gradle-plugin