2017-06-03 46 views
0

我想寫一個自定義插件,將生成一些代碼(特別是一個Dagger模塊)關閉我的Android項目中的一些xml文件。我已經能夠獲得代碼生成,但是當我嘗試在匕首組件中使用生成的模塊時,Dagger編譯器失敗:從Gradle插件生成的代碼不可見使用android-apt的Dagger編譯器

我已經放在一起演示了失敗的small demo project。有兩個模塊:插件和Android應用程序(僅供參考:我必須在應用程序的build.gradle中註釋與插件相關的代碼,直到我在本地安裝插件)。

當我重建應用程序時,生成的模塊出現在我期望的位置,而匕首組件在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 

那麼,是什麼魔力我思念到允許匕首編譯器看到我生成的代碼?

回答

0

經過一些更多的實驗,我相信我找到了答案。我還不知道爲什麼這個工作,但如果我將輸出目錄添加到AndroidSourceSet的srcDir到p.afterEvaluate閉包之前,它似乎找到它。

這對我來說似乎很奇怪,因爲任務依賴只是在afterEvaluate塊中添加的,而且它看起來好像新任務在編譯之前被執行,所以即使沒有這個改變,我也會期望srcDir add也可以在編譯嘗試之前執行。

但至少我現在工作。