2017-01-20 29 views
2

Gradle(バージョン3.3)がマルチプロジェクト設定(Javaサブプロジェクトを使用)でタスク依存関係を解決する方法についての小さな質問です。私はかなり勉強しているので、愚かな質問かもしれません...マルチプロジェクトのGradle dependsonとdefaultTasks

私はコンパイルの前に実行されるタスクとコンパイル後に実行されるタスクを達成したいと思います。

defaultTasksを使用すると、期待どおりに動作します。しかし、dependsOnを使ってタスクを定義するときは、そうではありません。

マイルートbuild.gradleファイルは次のようになります。予想通り、私はgradleデフォルトのタスクを実行すると

defaultTasks 'a', 'classes', 'b' 

task a { 
    doLast { 
     println 'before compile' 
    } 
} 

task b { 
    doLast { 
     println 'after compile' 
    } 
} 

task doIt(dependsOn: [a, 'classes', b]) { 
    doLast { 
     println('done!') 
    } 
} 

allprojects { 
    group = 'foo' 

    repositories { 
     mavenCentral() 
     maven { 
      url 'https://maven.atlassian.com/3rdparty/' 
     } 
    } 
} 

subprojects { 
    ext { 
     springVersion = '4.3.5.RELEASE' 
    } 
    apply plugin: 'java' 
    dependencies { 
     compile fileTree(dir: 'lib', include: '*.jar') 
     testCompile group: 'junit', name: 'junit', version: '4.12' 
    } 
} 

が実行されている:私は取得「コンパイルの前に」、そして、すべてのサブプロジェクトは、「コンパイル後」、その後、コンパイルされています。

私はgradle doItを実行すると、私は次のエラーメッセージ

Task with path 'classes' not found in root project 'teambits-core'. 

にこのような場合は理由を任意のアイデアを得ますか?

答えて

1

あなたのbuild.gradleをそのまま使用すると、「gradle」を実行するだけで3.3のインストールで同じエラーが発生します。

ここには2つの問題があります。 allprojects

1.マルチプロジェクトのサブプロジェクトは、最初の問題はdefaultTasksがメインbuild.gradleに定義されていますが、あなたのJavaプラグインのみのサブプロジェクトに含まれていることです。

マルチプロジェクトビルドでは、 'master'プロジェクトはサブプロジェクトセクションの一部ではなく(すべてのプロジェクトのみがマスタープロジェクトに影響を与えます)、 'defaultTasks'がトップレベルで定義されているため、 'gradle'マスタープロジェクトのdefaultTasksを呼び出し、javaプラグインをロードしないため、クラスタスクを失敗させます。

これを修正するには、 'apply plugin'行をallprojectsに移動します(ただし、この図では通常、サブプロジェクトの設定に関する一般的な手順でjavaプラグインをマスターにロードしません)。第二の問題は、あなたがdefaultTasksとDEPENDSON間の実質的な違いをヒットします(あなたが適用されたプラグインを移動すると仮定した場合)されDEPENDSON

2. defaultTasks。それらの間と、そのようなシナリオには依存関係が存在しないとして(

$ gradle 
:a 
before compile 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:b 
after compile 

BUILD SUCCESSFUL 

Total time: 0.765 secs 

をしかし、リストの順序でのdoItを実行すると、アルファベット順にそれらを実行するGradleの原因になります:

defaultTasksは、指定した順序でタスクを実行しますアルファベット順に実行されます)。

$ gradle doit 
:a 
before compile 
:b 
after compile 
:compileJava UP-TO-DATE 
:processResources UP-TO-DATE 
:classes UP-TO-DATE 
:doIt 
done! 

BUILD SUCCESSFUL 

Total time: 0.733 secs 

はこの場合mustRunAfter

との依存関係の順序を修正し、あなたはのdoItに以下を追加することによって、それを修正することができます:

後に行われるように、Bのタスクを強制します
task doIt(dependsOn: [a, 'classes', b]) { 
    b.mustRunAfter(':classes') 
    doLast { 
     println('done!') 
    } 
} 

+0

詳細な回答ありがとうございました。特に.mustRunAfterはとても役に立ちました。 – Axel

+0

@Axel - 私は助けることができてうれしい。私は実際にあなたの質問を見つけました。私も同様の問題がありました。私の問題を解決するには、それもあなたの問題を解決しました。 –

+0

これはwin-winの状況の1つです:-) – Axel

関連する問題