Сгенерированный код из плагина 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 также будет выполнено до попытки компиляции.

Но по крайней мере у меня сейчас работает.

Другие вопросы по тегам