33

他の多くのタスクを呼び出す必要があるタスクをgradleで作成しています。

ここに私が持っているものがあります:

task ci(dependsOn: [
    clean,
    build,
    test
])

奇妙なのは、私が見る出力です:

gradle ci
:compileJava
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:clean             // cleaning after the build
:build
:ci

クリーンはビルド ターゲットの後に発生することに注意してください。これにより、ビルドが消去されます。

タスクを次のように変更した場合:

task ci(dependsOn: [
    clean,
    test
])

次に、正しい順序で実行されるように見えます。

:clean UP-TO-DATE    // cleaning before the build
:compileJava
:processResources UP-TO-DATE
:classes
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:ci UP-TO-DATE

build.dependsOn クリーンを追加して元のターゲットを修正しようとしましたが、これは影響がないようです。

どんな助けでも大歓迎です。

4

4 に答える 4

42

GRADLE-427で議論されている、 gradleがタスクを実行するための最良の順序を決定するという問題に遭遇したようです。Gradle ユーザーガイド - セクション 15.5にも記載されているアドバイスに従って、異種のタスク間の順序を確立することで問題を解決しました。したがって、私の最終的なciターゲットは次のようになります。

task ci(dependsOn: ['clean', 'build', 'uploadArchives'])
build.mustRunAfter clean
uploadArchives.mustRunAfter build

そして、すべてが期待どおりに機能するようになりました。

于 2013-07-19T23:27:15.360 に答える
0

Groovy/Gradle の利点を利用すると、次の方法でソリューションをさらに改善できます。

def taskNames = [...] // list of task names

task('lastTask', dependsOn: taskNames)

taskNames.inject(null) { acc, val ->
  if (acc != null) tasks[val].mustRunAfter acc
  tasks[val]
}

このようにして、タスクのリストを 1 か所にまとめることができます。

于 2016-01-12T12:56:52.290 に答える