本文は、Gradle の全体について紹介し、Task、Project などの関連する概念や Gradle を使用してプロジェクトをビルドするための一般的な操作について学びます。主な内容は以下の通りです。
- Setting ファイル
- Build ファイル
- Project と Tasks
- タスクの作成
- タスクの依存関係
- タスク間の相互作用
- カスタムプロパティ
- 結論
Setting ファイル#
Gradle プロジェクトの Setting ファイルについて説明します。このファイルは、現在のプロジェクトの設定を行うために使用されます。たとえば、Android 開発では、1 つのプロジェクトに複数のサブモジュールがある場合、不要なサブモジュールを設定ファイルの Setting で無効にすることができます。もちろん、Setting ファイルで設定されたサブモジュールのみがビルドされます。Android 開発に限らず、Gradle を使用してプロジェクトをビルドする場合は、すべて同じです。Setting は Gradle ビルドプロジェクトのデフォルトの設定ファイル名です。以下に Setting.gradle ファイルの使用例を示します。
println "---------test----Setting.gradle----------"
//現在のプロジェクトディレクトリを出力
println(rootDir)
//ビルドに参加するサブプロジェクトを指定
include ':Method'
project(':Method').projectDir = new File(rootDir,'test/Method')
出力結果を見てみましょう。
PS E:\Gradle\study\GradleSetting> gradle testGradleSetting
---------test----Setting.gradle----------
E:\Gradle\study\GradleSetting
> Configure project :
testGradleSetting
> Configure project :Method
3
3
30
Get the result of the method: 30
1
2
3
4
5
BUILD SUCCESSFUL in 2s
Setting.gradle ファイルで Method を設定したため、Method がビルドに参加していることが確認できます。Setting.gradle ファイルの設定を削除すると、Method はビルドされなくなります。自分で確認してみてください。
上記の設定では、Method がどこにあるかを指定しています。指定しない場合、デフォルトでは Setting.gradle と同じ階層になります。
Build ファイル#
Gradle を使用してプロジェクトをビルドする場合、各プロジェクトには build.gradle ファイルがあります。このファイルはプロジェクトのビルドのエントリーポイントであり、プロジェクト全体の設定が有効になります。ルートプロジェクトでサブプロジェクトの一般的な設定を行うことができます。たとえば、サブプロジェクトのリポジトリを jcenter に設定すると、サブプロジェクト内のすべての依存関係が jcenter からダウンロードされます。以下は参考コードです。
//サブプロジェクトの依存関係リポジトリを設定
subprojects{
repositories{
jcenter()
}
}
//すべてのプロジェクトを設定
allprojects{
}
...
このセクションでは、build.gradle ファイルの役割について理解することが目的です。実際の開発では、異なるタイプのプロジェクトに対してより詳細な設定戦略があります。
Project と Tasks#
Gradle では、多くの Project があります。ある Project を jar にパッケージングして別の Project で使用することができます。各 Project は、ビジネス要件に基づいて抽象化されたサブモジュールであり、Gradle を使用して完全なプロジェクトにビルドされます。
各 Project には複数のタスクを持つことができます。タスクは、特定の機能を実行するためのものです。たとえば、wrapper タスクは、wrapper ファイルの作成を主な目的としています。
タスクの作成#
タスクの作成については既にかなり理解していると思いますが、以下のコードを使用してタスクを宣言します。
//タスクの作成
task createTask{
doFirst{
println 'doFirst'
}
doLast{
println 'doLast'
}
}
//TaskContainerを使用してタスクを作成する
tasks.create("createTask1"){
doFirst{
println 'doFirst'
}
doLast{
println 'doLast'
}
}
task はタスクを作成するためのキーワードですが、実際には task は Project 内のメソッドです。Groovy では、メソッドの引数の括弧を省略することができます。中括弧内の内容はクロージャであり、タスクに関連する設定を行います。doFirst と doLast は、タスクでよく使用される 2 つのメソッドであり、それぞれタスクの開始と終了時に実行されます。
タスクの依存関係#
タスクは互いに依存関係を持つことができ、特定のタスクの実行順序を制御することができます。たとえば、A を実行する前に必ず B を実行する必要がある場合、タスク A はタスク B に依存しています。以下のコードを参考にしてください。
//単一タスクの依存関係:dependsOnを使用して依存するタスクを指定する
task B(dependsOn: A){
doFirst{
println 'B'
}
}
task C{
doFirst{
println 'C'
}
}
//複数のタスクの依存関係
task D{
dependsOn A, C
doFirst{
println 'D'
}
}
次に、複数の依存タスクを実行する gradle D の実行結果を見てみましょう。
PS E:\Gradle\study\GradleSetting> gradle D
> Task :A
A
> Task :C
C
> Task :D
D
BUILD SUCCESSFUL in 2s
明らかに、タスク D を実行すると、依存する他の 2 つのタスクが先に実行され、タスクの実行順序が制御されます。
注意:スクリプトは順番に実行されるため、タスク A と C がタスク D の後に定義されている場合、タスク D を実行するとエラーが発生します。
タスク間の相互作用#
作成したタスクにはそれぞれ名前があり、そのタイプは Task です。したがって、タスク API を使用してタスクの実行を制御することができます。タスク名を使用してタスクを操作する原理は、Project がタスクを作成する際に、そのタスクに対応するタスクを Project オブジェクトの Task 型のプロパティとして宣言しているためです。以下はテストコードです。
//タスク間の相互作用
task E{
println 'hello e'
println "EはProjectのプロパティですか?:"+project.hasProperty('E')
}
E.doFirst{
println 'doFirst'
}
E.doLast{
println 'doLast'
}
上記のコードの実行結果は次のとおりです。
PS E:\Gradle\study\GradleSetting> gradle E
> Configure project :
hello e
EはProjectのプロパティですか?:true
> Task :E
doFirst
doLast
BUILD SUCCESSFUL in 1s
カスタムプロパティ#
Project と Task の両方に、ユーザーが追加のカスタムプロパティを追加することができます。これは、それぞれの対応する ext プロパティを使用して行います。追加したプロパティは、ext プロパティを使用して読み取りと設定を行うことができます。複数のカスタムプロパティを同時に追加する場合は、ext ブロックを使用することができます。以下はカスタムプロパティを定義するためのコードの例です。
apply plugin:"java"
//単一のカスタムプロパティを定義する
ext.name1 = "Gradle"
//複数のカスタムプロパティを定義する
ext{
age = 10
score = 100
}
//SourceSetでカスタムプロパティを使用する
sourceSets.all{
ext.resourceDir = null
}
//カスタムプロパティを設定する
sourceSets{
main{
resourceDir = "main/res"
}
test{
resourceDir = "test/res"
}
}
task customProperty{
println "name=${name1}"
println "age=${age}"
println "score=${score}"
sourceSets.each {
println "${it.name} resourceDir is ${it.resourceDir}"
}
}
上記のコードの実行結果は次のとおりです。
PS E:\Gradle\study\GradleSetting> gradle customProperty
> Configure project :
name=Gradle
age=10
score=100
main resourceDir is main/res
test resourceDir is test/res
BUILD SUCCESSFUL in 2s
カスタムプロパティは、ローカル変数のスコープよりも広い範囲で使用できます。これらのプロパティが属するオブジェクトにアクセスできる場合、これらのプロパティにアクセスすることができます。 Android 開発では、カスタムプロパティを使用してバージョン番号、バージョン名、および使用するサードパーティライブラリのバージョンを個別に定義し、それらを個別の gradle ファイルにまとめて各モジュールで取得することができます。これにより、依存関係ライブラリのバージョンを管理するのが容易になるだけでなく、作業効率も向上します。
結論#
Gradle スクリプトは Groovy に基づいており、Groovy は完全に Java の構文と互換性があります。Gradle スクリプトは本質的にはコードであり、関連する機能を実現するために関連する構文を使用することができます。Gradle シリーズの記事は以下のとおりです。