Созданный java исходный код не найден компилятором kotlin - PullRequest
0 голосов
/ 06 мая 2020

Я пишу плагин 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

В любом случае код создается правильно и помещается в нужное место, но я не могу заставить компилятор распознавать мои сгенерированные код. Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 07 мая 2020

Я реорганизовал код и реализовал описанную здесь стратегию:

мой новый код выглядит так:

project.afterEvaluate {
        val appExtension = project.extensions.findByType(AppExtension::class.java)
        appExtension?.applicationVariants?.all { variant ->

            val processResourcesTask = project.tasks.getByName("process${variant.name.capitalize()}Resources")
            val myTask = it.task("my${variant.name.capitalize()}ResourceTask") {
                it.doLast {
                    doSomeStuff(project, extension, variant.name.capitalize())
                }
            }.dependsOn(processResourcesTask)

            val outputDir = "${project.buildDir}/generated/source/myplugin/${variant.name}"
            variant.registerJavaGeneratingTask(myTask, File(outputDir))
            val kotlinCompileTask = it.tasks.findByName("compile${variant.name.capitalize()}Kotlin") as? SourceTask
            if (kotlinCompileTask != null) {
                kotlinCompileTask.dependsOn(myTask)
                val srcSet = it.objects.sourceDirectorySet("myplugin", "myplugin").srcDir(outputDir)
                kotlinCompileTask.source(srcSet)
            }
        }
    }

Я также удалил определение sourceSets из клиентского файла build.gradle, и теперь все работает правильно.

...