2017-06-03 7 views
0

私のアンドロイドプロジェクトのxmlファイルのいくつかのコード(特にDaggerモジュール)を生成するカスタムプラグインを作成しようとしています。私は生成するコードを得ることができましたが、Daggerコンポーネントで生成されたモジュールを試してみると、Daggerコンパイラは失敗します:android-aptを使用してDaggerコンパイラから生成されたコードGradle Plugin

私はエラーを示すsmall demo projectをまとめました。プラグインとアンドロイドアプリの2つのモジュールがあります(FYI:プラグインをローカルにインストールするまで、アプリの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が追加されますコンパイルの試行前に実行されることもあります。

しかし、少なくとも私は今すぐ働いています。

関連する問題