我正在尝试编写一个自定义插件,它将从我的android项目中的一些xml文件生成一些代码(具体地说,是一个Dagger模块)。我已经能够生成代码,但当我尝试在Dagger组件中使用生成的模块时,Dagger编译器失败:
我已经编写了一个small demo project来演示失败的原因。有两个模块:插件和安卓应用程序(仅供参考:我不得不在应用程序的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编译器看到我生成的代码呢?
发布于 2017-06-06 00:15:56
经过更多的实验,我相信我找到了答案。我还不知道为什么要这样做,但是如果我将添加到AndroidSourceSet的srcDir中的输出目录移到p.afterEvaluate闭包之前,它似乎能找到它。
这对我来说似乎很奇怪,因为任务依赖项只添加到afterEvaluate块中,而且看起来新任务是在编译之前执行的,所以即使没有这种更改,我也希望srcDir添加也会在编译尝试之前执行。
但至少我现在让它工作了。
https://stackoverflow.com/questions/44347826
复制相似问题