本文将对 Gradle 整体进行了介绍和学习,了解了 Task、Project 等相关概念以及对使用 Gradle 来构建项目的一些常用操作,主要内容如下:
- Setting ファイル
- Build ファイル
- Project と Tasks
- タスクの作成
- タスク依存
- タスク間の相互作用
- カスタム属性
- まとめ
Setting ファイル#
Gradle でプロジェクトを構築するための Setting ファイルについて説明します。このファイルは現在のプロジェクトを設定するために使用されます。たとえば、Android 開発では、1 つのプロジェクトに複数のサブモジュールがある場合があります。特定のサブモジュールが不要な場合は、そのモジュールの設定を設定ファイルの Setting から削除するだけで済みます。もちろん、Setting ファイルに設定されたサブモジュールのみが構築されます。Android 開発だけでなく、Gradle を使用して構築されるプロジェクトはすべて同様です。Setting は Gradle 構築プロジェクトのデフォルトの設定ファイル名です。以下は Setting.gradle ファイルの使用を簡単にテストしたものです。テストプロジェクトのディレクトリは次のとおりです:
├─GradleSetting
│ ├─.gradle
│ │ ├─4.1
│ │ │ ├─fileChanges
│ │ │ ├─fileHashes
│ │ │ └─taskHistory
│ │ └─buildOutputCleanup
│ └─test
│ └─Method
│ └─.gradle
│ ├─4.1
│ │ ├─fileChanges
│ │ ├─fileHashes
│ │ └─taskHistory
│ └─buildOutputCleanup
│ build.gradle
│ setting.gradle
プロジェクト名が GradleSetting のプロジェクト内の test フォルダーには Method というサブプロジェクトがあります。ここでは、setting.gradle ファイルを設定してサブプロジェクト Method を GradleSetting に構築します。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
取得したメソッドの戻り値: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 には複数のタスクを持つことができ、Task はタスクとして理解され、特定の機能を完了するために使用されます。たとえば、wrapper タスクは wrapper ファイルの作成を主に行います。
タスクの作成#
タスクの作成にはすでに慣れていると思います。以下では task を使用してタスクを宣言します:
//1. タスクを作成
task createTask{
doFirst{
println 'doFirst'
}
doLast{
println 'doLast'
}
}
//2. TaskContainer を使用してタスクを作成、Project で定義された TaskContainer、つまり tasks
tasks.create("createTask1"){
doFirst{
println 'doFirst'
}
doLast{
println 'doLast'
}
}
task はタスクを作成するためのキーワードと理解できます。実際には task は Project 内のメソッドであり、Groovy ではメソッドの引数の括弧を省略できます。波括弧内の内容はクロージャであり、主に task の関連設定を行います。doFirst と doLast は Task 内でよく使用される 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 です。したがって、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 では関連する構文を利用して関連機能を実現できます。以下は Gradle シリーズの記事です: