【发布时间】:2017-06-03 19:32:02
【问题描述】:
我正在尝试编写一个自定义插件,它将从我的 android 项目中的一些 xml 文件中生成一些代码(特别是 Dagger 模块)。我已经能够生成代码,但是当我尝试在 Dagger 组件中使用生成的模块时,Dagger 编译器失败:
我整理了一个 small demo project 来演示失败。有两个模块:插件和 android 应用程序(仅供参考:我必须在应用程序的 build.gradle 中注释掉与插件相关的代码,直到我在本地安装了插件)。
当我重新构建应用程序时,生成的模块会显示在我期望的位置,并且 dagger 组件会在 IJ 中看到它。但在 android-apt 插件调用 dagger 编译器时它显然不可用(或者该位置未包含在编译器正在查看的代码中)。
我确保所有编译任务都依赖于我的“生成”任务,而失败的任务是 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
那么,让 dagger 编译器看到我生成的代码,我缺少什么魔法?
【问题讨论】:
标签: android gradle gradle-plugin