Сгенерированный код из плагина Gradle не виден компилятору Dagger с помощью android-apt
Я пытаюсь написать собственный плагин, который будет генерировать некоторый код (в частности, модуль Dagger) из некоторых XML-файлов в моем проекте Android. Я смог получить код для генерации, но когда я пытаюсь использовать сгенерированный модуль в компоненте Dagger, компилятор Dagger не работает:
Я собрал небольшой демонстрационный проект, который демонстрирует провал. Есть два модуля: плагин и приложение для Android (к вашему сведению: мне приходилось комментировать код, связанный с плагином, в build.gradle приложений, пока я не установил плагин локально).
Когда я перестраиваю приложение, сгенерированный модуль обнаруживается именно там, где я его ожидаю, а компонент кинжала видит его в IJ. Но он, очевидно, недоступен в тот момент, когда плагин android-apt вызывает компилятор кинжала (или это местоположение не включено в код, который просматривает компилятор).
Я позаботился о том, чтобы все задачи компиляции зависели от моей задачи "генерации", а неудачная задача compileDebugJavaWithJavac
который поэтому должен знать о моем сгенерированном коде.
Для того, чтобы попытаться включить источник, у меня есть:
AndroidSourceSet mainSourceSet = p.android.sourceSets.getByName('main')
LOG.info("Adding directory ${outputDir} to android source set ${mainSourceSet}")
mainSourceSet.java.srcDir(outputDir)
Несмотря на это, я получаю:
Compiling with JDK Java compiler API.
C:\projects\java\android\android_plugin_demo\plugindemoapplication\src\main\java\com\bdl\plugindemoapplication\DaggerComponent.java:12: error: cannot find symbol
@Component(modules = PluginDaggerModule.class)
^
symbol: class PluginDaggerModule
C:\projects\java\android\android_plugin_demo\plugindemoapplication\src\main\java\com\bdl\plugindemoapplication\DaggerComponent.java:13: error: dagger.internal.codegen.ComponentProcessor was unable to process this interface because not all of its dependencies could be resolved. Check for compilation errors or a circular dependency with generated code.
public interface DaggerComponent {
^
2 errors
Итак, какую магию мне не хватает, чтобы компилятор кинжалов мог видеть мой сгенерированный код?
1 ответ
Я думаю, что после еще нескольких экспериментов я нашел ответ. Я пока не знаю, почему это работает, но если я перенесу добавление выходного каталога в srcDir AndroidSourceSet до p.afterEvaluate
закрытие, кажется, чтобы найти его.
Это кажется мне странным, поскольку зависимость задачи добавляется только в блоке afterEvaluate, и похоже, что новая задача выполнялась до компиляции, поэтому даже без этого изменения я ожидал бы, что добавление srcDir также будет выполнено до попытки компиляции.
Но по крайней мере у меня сейчас работает.