web-dev-qa-db-ja.com

gradle内の他のすべてのタスクの前に実行されるタスクを作成する

実行時に他のすべてのタスクの前に実行される初期化タスクを作成する必要があります。

task A {
    println "Task A"
}

task initializer {
   println "initialized"
}

gradle -q Aを実行すると、出力は次のようになります。

>initialized

>Task A

今、私が追加する場合:

task B {
    println "Task B"
}

gradle -q Bを実行すると、次のようになります。

>initialized

>Task B

したがって、どのタスクを実行するかは関係ありません。常に最初に「初期化」されます。

9
Ori Wiesel

名前が「初期化子」ではないすべてのタスクを「初期化子」タスクに依存させることができます。例えば:

task initializer {
   doLast { println "initializer" }
}

task task1() {
   doLast { println "task1" }
}

// make every other task depend on 'initializer'
// matching() and all() are "live" so any tasks declared after this line will also depend on 'initializer'
tasks.matching { it.name != 'initializer' }.all { Task task ->
    task.dependsOn initializer
}

task task2() {
   doLast { println "task2" }
}

または、 BuildListener を追加することもできます(または、便利なメソッドの1つを使用します。例: Gradle.buildStarted(...)

9
lance-java

以前に提案されたdependsOnを使用したソリューションは正常に機能しますが、タスクの依存関係が変更されて混乱するのは気に入らないです。私の頭に浮かぶ最初の解決策は、 Gradle Initialization Scripts を使用することです。彼らは本当にクールです。ただし、使用法は少し面倒です。現在、デフォルトのプロジェクトローカルGradle初期化スクリプトを使用する方法はありません。コマンドラインでスクリプトを明示的に指定するか、スクリプトをUSER_HOME/GRADLE_HOMEに配置する必要があります。

したがって、initタスク/スクリプトなどの初期化を実行するために使用できる別のソリューション(@ lance-Javaですでに簡単に説明されています)は、「ビルドリスナー」です。初期化コードの実行の早さ/遅さに応じて、次の2つのいずれかを使用します。

gradle.afterProject {
    println '=== initialized in afterProject'
}

または

gradle.taskGraph.whenReady {
    println '=== initialized in taskGraph.whenReady'
}

ここでは、 Gradleインターフェイス および BuildListener のドキュメントを示します。

一部のイベントは非常に早い段階で発生するため、たとえば次のように、そのために使用できない可能性があることに注意してください。 beforeProjectおよびbuildStarted(説明 ここ および そこ )。

1
t0r0X

実行フェーズを目指しているようで、各タスクをプリカーシングするタスクが必要ですか、それとも実行フェーズの最初のタスクとして実行するだけですか?

タスクが評価された後、他のタスクの前に常にすべてのプロジェクトで実行されるようにしたい場合は、メインのbuild.gradleにクロージャを追加できます。

allprojects {
  afterEvaluate {
    for(def task in it.tasks)
      if(task != rootProject.tasks.YourTask)
      task.dependsOn rootProject.tasks.YourTask
  }
}

または

tasks.matching {it != YourTask}.all {it.dependsOn YourTask}

タスク実行グラフ を使用してライフサイクルを定義することもできます。ニーズとプロジェクト構造に応じて、目標を達成する方法はいくつかあります。

0
LazerBanana