2017-05-03 25 views
0

私は、タスクが実行されると、その名前のタスクを持つサブプロジェクトのサブプロジェクト内でのみ同じ名前のタスクを実行するように、ルートプロジェクトにタスクを作成したいと考えています。再帰的なGradleタスクを作成するには?

タスクの名前をハードコードしたくないのは、後でサブプロジェクトを追加することができるからです。

task checkArtifacts 
subprojects.findAll { subproject -> 
    subproject.getTasksByName('checkArtifacts', false) 
}.forEach { task -> 
    checkArtifacts.dependsOn(task) 
} 

設定ステージが強制的に終了し、設定ステージの変更を行うプラグインが壊れているように見えるため、動作しません。

task checkArtifacts 
afterEvaluate { 
    subprojects.findAll { subproject -> 
    subproject.getTasksByName('checkArtifacts', false) 
    }.forEach { task -> 
    checkArtifacts.dependsOn(task) 
    } 
} 

コレクションに将来の更新に適用されているDomainObjectCollectionでいくつかの方法がありますCould not determine the dependencies of task ':checkArtifacts'.

答えて

1

を発します。

例:all

は、このコレクション内のすべてのオブジェクト、およびその後にこのコレクションに追加されたオブジェクトに対して与えられたクロージャを実行します。オブジェクトはクロージャデリゲートとしてクロージャに渡されます。あるいは、パラメータとして渡されます。

そしてmatching

与えられたクロージャの仕様を満たして、このコレクション内のオブジェクトを含むコレクションを返します。返されたコレクションはライブなので、一致するオブジェクトがこのコレクションに追加されたときに、フィルタリングされたコレクションにも表示されます。

ので

subprojects { 
    tasks.matching { it.name == 'checkArtifacts' }.all { task -> 
     rootProject.tasks.checkArtifacts.dependsOn task 
    } 
} 
1

のようなものは、あなたは、このタスクはすべてのルートに定義された必要がありますか?ルートでタスク 'checkArtifacts'を呼び出すだけで、定義されているすべてのサブプロジェクトに対して実行されます。特別な作業をする必要はありません。

あなたがそれを行うために必要がある場合、私はTaskContainerを使用して、よりこのような何かを試してみた:

task checkArtifacts 

subprojects { 
    tasks.whenTaskAdded { task -> 
     if (task.name == 'checkArtifacts') { 
      rootProject.tasks.checkArtifacts.dependsOn task 
     } 
    } 
} 
+0

はい、それは本当です。私は別のrootProjectタスクがこれに依存してほしいということを忘れてしまった。 –

関連する問題