Gradle-tasks

提供:Dev Guides
移動先:案内検索

Gradle-タスク

Gradleビルドスクリプトは、1つ以上のプロジェクトについて説明します。 各プロジェクトは異なるタスクで構成されています。 タスクは、ビルドが実行する作業です。 タスクには、いくつかのクラスのコンパイル、クラスファイルの個別のターゲットフォルダへの保存、JARの作成、Javadocの生成、またはリポジトリへの成果の公開があります。

この章では、タスクとは何か、タスクを生成および実行する方法について説明します。

タスクを定義する

タスクは、ビルドスクリプトにタスクを定義するために使用されるキーワードです。 finddevguides を出力する hello という名前のタスクを表す次の例を見てください。 次のスクリプトをコピーして、 build.gradle という名前のファイルに保存します。 このビルドスクリプトは、finddevguides文字列を出力するために使用されるタスク名helloを定義します。

task hello {
   doLast {
      println 'finddevguides'
   }
}

コマンドプロンプトで次のコマンドを実行します。 上記のスクリプトを実行します。 build.gradleファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q hello

出力:

finddevguides
*doLast* ステートメントへのショートカット(記号 *<<* を表す)を指定することにより、このhelloタスクを単純化できます。 このショートカットを上記のタスク *hello* に追加すると、次のスクリプトのようになります。
task hello << {
   println 'finddevguides'
}
*gradle –q hello* コマンドを使用して、上記のスクリプトを実行できます。

タスクの定義にはいくつかのバリエーションがありますので、ご覧ください。 次の例では、タスク hello を定義しています。

次のコードをコピーして build.gradle ファイルに保存します。

task (hello) << {
   println "finddevguides"
}

コマンドプロンプトで次のコマンドを実行します。 上記のスクリプトを実行します。 build.gradleファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q hello

出力:

finddevguides

タスク名に文字列を使用することもできます。 同じhelloの例を見てください。 ここでは、タスクとして文字列を使用します。

次のコードをコピーして build.gradle ファイルに保存します。

task('hello') << {
   println "finddevguides"
}

コマンドプロンプトで次のコマンドを実行します。 上記のスクリプトを実行します。 build.gradleファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q hello

出力:

finddevguides

タスクを定義するための代替構文も使用できます。 create()メソッドを使用してタスクを定義しています。 以下に示す同じhelloの例を見てください。

以下のコードをコピーして build.gradle ファイルに保存します。

tasks.create(name: 'hello') << {
   println "finddevguides"
}

コマンドプロンプトで次のコマンドを実行します。 上記のスクリプトを実行します。 build.gradleファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q hello

出力:

finddevguides

タスクを見つける

ビルドファイルで定義したタスクを検索する場合は、それぞれの標準プロジェクトプロパティを使用する必要があります。 つまり、各タスクは、タスク名をプロパティ名として使用して、プロジェクトのプロパティとして使用できます。

プロパティとしてタスクにアクセスする次のコードを見てください。

以下のコードをコピーして build.gradle ファイルに保存します。

task hello

println hello.name
println project.hello.name

コマンドプロンプトで次のコマンドを実行します。 上記のスクリプトを実行します。 build.gradleファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q hello

出力:

hello
hello

タスクコレクションを通じてすべてのプロパティを使用することもできます。

次のコードをコピーして build.gradle ファイルに保存します。

task hello

println tasks.hello.name
println tasks['hello'].name

コマンドプロンプトで次のコマンドを実行します。 上記のスクリプトを実行します。 build.gradleファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q hello

出力:

hello
hello

タスクを使用してタスクのパスにアクセスすることもできます。 このために、タスク名、相対パス、または絶対パスでgetByPath()メソッドを呼び出すことができます。

以下のコードをコピーして build.gradle ファイルに保存します。

project(':projectA') {
   task hello
}
task hello

println tasks.getByPath('hello').path
println tasks.getByPath(':hello').path
println tasks.getByPath('projectA:hello').path
println tasks.getByPath(':projectA:hello').path

コマンドプロンプトで次のコマンドを実行します。 上記のスクリプトを実行します。 build.gradleファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q hello

出力:

:hello
:hello
:projectA:hello
:projectA:hello

タスクへの依存関係の追加

タスクを別のタスクに依存させることができます。つまり、1つのタスクが完了すると、他のタスクのみが開始されます。 各タスクは、タスク名で区別されます。 タスク名のコレクションは、そのタスクコレクションによって参照されます。 別のプロジェクトのタスクを参照するには、プロジェクトのパスを各タスク名のプレフィックスとして使用する必要があります。

taskXからtaskYに依存関係を追加する次の例。

以下のコードをコピーして build.gradle ファイルに保存します。 次のコードを見てください。

task taskX << {
   println 'taskX'
}
task taskY(dependsOn: 'taskX') << {
   println "taskY"
}

コマンドプロンプトで次のコマンドを実行します。 上記のスクリプトを実行します。 build.gradle ファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q taskY

出力:

taskX
taskY

上記の例では、名前を使用してタスクへの依存関係を追加しています。 タスクオブジェクトを使用して依存関係を定義するタスクの依存関係を実現する別の方法があります。

taskXに依存するtaskYの同じ例を取り上げますが、タスク参照名の代わりにタスクオブジェクトを使用しています。

次のコードをコピーして build.gradle ファイルに保存します。

task taskY << {
   println 'taskY'
}
task taskX << {
   println 'taskX'
}
taskY.dependsOn taskX

コマンドプロンプトで次のコマンドを実行します。 build.gradleファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q taskY

出力:

taskX
taskY

上記の例では、名前を使用してタスクへの依存関係を追加しています。 タスクオブジェクトを使用して依存関係を定義するタスクの依存関係を実現する別の方法があります。

ここでは、taskYがtaskXに依存しているのと同じ例を取り上げますが、タスク参照名の代わりにタスクオブジェクトを使用しています。 それを見てみましょう。

以下のコードをコピーして build.gradle ファイルに保存します。 次のコードを見てください。

task taskX << {
   println 'taskX'
}
taskX.dependsOn {
   tasks.findAll {
      task → task.name.startsWith('lib')
   }
}
task lib1 << {
   println 'lib1'
}
task lib2 << {
   println 'lib2'
}
task notALib << {
   println 'notALib'
}

コマンドプロンプトで次のコマンドを実行します。 上記のスクリプトを実行します。 build.gradle ファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q taskX

出力:

lib1
lib2
taskX

タスクへの説明の追加

タスクに説明を追加できます。 この説明は、* Gradleタスク*を実行すると表示されます。 これは、descriptionキーワードを使用することで可能です。

次のコードをコピーして build.gradle ファイルに保存します。 次のコードを見てください。

task copy(type: Copy) {
   description 'Copies the resource directory to the target directory.'
   from 'resources'
   into 'target'
   include('**/*.txt', '**/*.xml', '**/*.properties')
   println("description applied")
}

コマンドプロンプトで次のコマンドを実行します。 build.gradleファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q copy

コマンドが正常に実行されると、次の出力が得られます。

description applied

タスクをスキップする

タスクのスキップは、述語クロージャーを渡すことで実行できます。 これは、タスクのメソッドまたはタスクの実際の作業が実行される前に StopExecutionException をスローするクロージャーのメソッドの場合にのみ可能です。

次のコードをコピーして build.gradle ファイルに保存します。

task eclipse << {
   println 'Hello Eclipse'
}

//#1st approach - closure returning true, if the task should be executed, false if not.
eclipse.onlyIf {
   project.hasProperty('usingEclipse')
}

//#2nd approach - alternatively throw an StopExecutionException() like this
eclipse.doFirst {
   if(!usingEclipse) {
      throw new StopExecutionException()
   }
}

コマンドプロンプトで次のコマンドを実行します。 build.gradleファイルが保存されている場所でこれを実行する必要があります。

C:\> gradle –q eclipse

タスク構造

Gradleには、タスクを操作するときのさまざまなフェーズがあります。 まず、構成フェーズがあり、タスクのクロージャで直接指定されたコードが実行されます。 構成ブロックは、後で実際に実行されるタスクだけでなく、使用可能なすべてのタスクに対して実行されます。

構成フェーズの後、実行フェーズは、実際に実行されるタスクの doFirst または doLast クロージャー内のコードを実行します。