2013-07-12 27 views
24

私はgradleで他の多くのタスクを呼び出す必要があるタスクを作っています。ここで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 

注意、クリーンは私のビルドを払拭ビルドターゲット、後に発生していること。

私は私のタスクを変更する場合:私はきれいなbuild.dependsOnを追加することにより、当初の目標を固定しようとした

: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 

、しかし:

task ci(dependsOn: [ 
    clean, 
    test 
]) 

そして、正しい順序で実行するように見えますこれは影響がないようです。

何か助けていただければ幸いです。

答えて

38

GRADLE-427で議論されている問題を偶然見つけたようですが、gradleがタスクを実行するための最良の順序を決定します。 私は問題を解決しました。それには、Gradle User Guide - Section 15.5にも記載されているアドバイスに従ってください。期待通りに機能するようになりました

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

、すべて:として私の最後のCIターゲットは、このように表示されます。

+1

私は過去にこのアプローチを試しましたが、人為的な依存関係が導入されているため、この方法が嫌いです。私は過去に問題があって、私が必要としているものと正確になるように命令しました。私は、このスレッドの別の場所で概説されている "エイリアス"アプローチがうまく機能することを発見しました(人為的な依存関係を紹介しません) – Lance

2

注文を確実にするためにラッパータスクを追加したくないと思います。この場合

次のように、私の解決策がある -

run.dependsOn 'clean' compileJava.mustRunAfter 'clean'

これはGradleのはcompileJavaを実行する前にcleanタスクが実行される、ことを確認します。効果的に、常に新鮮なビルドを作成します。

これが役に立ちます。

8

TLDRバージョン:私は自分のプロジェクト(人為的な依存関係を導入しない)でこれをどのようにしたのですか?さらに、バックグラウンドのために

//--- build aliases : define a synonym here if you want a shortcut to run multiple targets 

def buildAliases = [ 
    'all' : ['clean', 'assemble', 'runProvisioner', 'stopTomcat', 'installTomcat', 'deployToTomcat', 'startTomcat'], 
    'rebuild' : ['clean', 'assemble'] 
] 
def expandedTaskList = [] 

gradle.startParameter.taskNames.each { 
    expandedTaskList << (buildAliases[it] ? buildAliases[it] : it) 
} 

gradle.startParameter.taskNames = expandedTaskList.flatten() 

println "\n\n\texpanded task list: ${gradle.startParameter.taskNames }\n\n" 

、以下を参照してください

https://caffeineinduced.wordpress.com/2015/01/25/run-a-list-of-gradle-tasks-in-specific-order/

+0

このリンクは質問に答えるかもしれませんが、参考のため。リンクされたページが変更された場合、リンクのみの回答は無効になります。 – ZygD

+0

完了。誰かがここに来て時間をかけて物事を説明して(あなたのフィードバックに基づいて答えを調整する)、それを下降させるべきではありません。これで私はここに投稿したくない。 – Lance

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つの場所があります。

関連する問題