Android を学んでいる期間があり、開発中に Gradle を頻繁に使用していますが、Gradle によるプロジェクト構築の原理を知らないため、Gradle に関連する知識を学ぶために少し時間をかける予定です。Gradle は非常に優れたプロジェクト構築ツールであり、その DSL(ドメイン特化言語)は Groovy に基づいて実装されており、ほとんどの機能はプラグインの形で実現されています。また、Gradle プラグインをカスタマイズすることもできます。以下に Gradle シリーズの最初の記事を始めます。
- Gradle 環境の設定
- Gradle 版 Hello World
- Gradle Wrapper
- Gradle ログ
- Gradle コマンドライン
- まとめ
Gradle 環境の設定#
まず、環境変数に JAVA_HOME が正しく設定されていることを確認し、以下のコマンドを使用して設定がされているか確認します:
java -version
実行結果は以下の図のようになります:
Gradle のバージョンを準備し、ダウンロード後に解凍します。解凍後のディレクトリの説明は以下の通りです:
bin:gradleバッチファイル
docs:説明文書
init.d:初期化スクリプトファイル
lib:関連ライブラリ
media:付属のアイコンリソース
samples:サンプル
src:ソースファイル
getting-started.html:入門ガイドリンク
LICENSE
NOTICE
次に、環境変数に GRADLE_HOME を設定します。具体的には Gradle の解凍ディレクトリを指します:
次に、GRADLE_HOME\bin を Path に追加します。具体的には以下の通りです:
その後、コンソールを開き、コマンド gradle -v を使用して Gradle のバージョン情報を確認します。Gradle のバージョン番号、Groovy のバージョン番号、JVM などの関連情報が正しく表示されれば、Gradle 環境が正常に設定されたことを示します。設定が成功した gradle -v の実行結果は以下の通りです:
PS E:\Gradle\study> gradle -v
------------------------------------------------------------
Gradle 4.1
------------------------------------------------------------
Build time: 2017-08-07 14:38:48 UTC
Revision: 941559e020f6c357ebb08d5c67acdb858a3defc2
Groovy: 2.4.11
Ant: Apache Ant(TM) version 1.9.6 compiled on June 29 2015
JVM: 1.8.0_91 (Oracle Corporation 25.91-b14)
OS: Windows 10 10.0 amd64
この時点で、Windows 上の Gradle 構築環境が整いました。
Gradle 版 Hello World#
どの言語を学ぶにしても、まずは Hello World を実行するのが間違いありません。ここでは、Hello World の Gradle スクリプトを実装します。build.gradle という名前のスクリプトを作成し、スクリプトの内容は以下の通りです:
task hello{
doLast{
println 'Hello world'
}
}
gradle -q hello コマンドを使用して上記のスクリプトを実行すると、結果は以下の通りです:
PS E:\Gradle\study> gradle -q hello
Hello world
build.gradle は Gradle のデフォルトの構築スクリプトファイルであり、コマンドを実行すると現在のディレクトリの build.gradle スクリプトファイルが自動的に読み込まれます。この構築スクリプトは、hello という名前のタスク(Task)を定義しており、その中の doLast は Task 内のアクションの一つです。この Task が完了した後に doLast 内のコードがコールバックされます。gradle コマンドでの引数 - q は出力ログレベルを指定するもので、gradle のログ出力レベルについては後で説明します。
Gradle Wrapper#
Wrapper は Gradle のラッパーであり、チーム内で Gradle のバージョンを統一管理するのに便利です。プロジェクト開発では通常 Wrapper の方法が使用されます。Wrapper を使用すると、Gradle の構築環境を設定する必要がなくなります。Wrapper を使用して Gradle を起動すると、Wrapper は Gradle がダウンロードされているかどうかを確認します。ダウンロードされていない場合は、設定されたアドレスからダウンロードして構築を行います。これにより、開発者がプロジェクトを構築する際に便利になります。
Wrapper の生成#
Gradle は Wrapper に必要なディレクトリファイルを生成するための組み込み Wrapper タスクを提供しています。該当するディレクトリで gradle wrapper コマンドを実行することで生成できます。参考は以下の通りです:
PS E:\Gradle\study> gradle wrapper
BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed
PS E:\Gradle\study> cd wrapper
gradle wrapper で生成されたファイルディレクトリは以下の通りです:
│─gradlew
│─gradlew.bat
└─gradle
└─wrapper
gradle-wrapper.jar
gradle-wrapper.properties
ここで gradlew と gradlew.bat はそれぞれ Linux と Windows での実行可能スクリプトであり、使用方法はネイティブの gradle コマンドと同じです。gradle-wrapper.jar は特定のビジネスに基づいて実装された jar パッケージであり、gradlew は最終的にこの jar パッケージを使用して関連する gradle 操作を実行します。gradle-wrapper.properties はどのバージョンの gradle を使用して構築操作を行うかを設定するためのものです。
Wrapper の設定#
gradle wrapper を使用して関連ファイルを生成する際に、使用するバージョン番号や Gradle のダウンロードアドレスを指定することができます。コマンドは以下の通りです:
//使用するGradleバージョンを指定
gradle wrapper --gradle-version 3.3
//Gradleのダウンロードアドレスを指定
gradle wrapper --gradle-distribution-url ...
Gradle のデフォルトバージョンは現在の Gradle のバージョンであり、ダウンロードアドレスは以下の通りです:
https\://services.gradle.org/distributions/gradle-4.1-all.zip
次に、Gradle の設定ファイル gradle-wrapper.properties のいくつかのフィールドの意味を見てみましょう:
distributionBase //ダウンロードしたGradle圧縮パッケージを解凍後に保存する主ディレクトリ
distributionPath //distributionBaseに対する解凍後の圧縮パッケージのパス
zipStoreBase //distributionBaseに対するGradle圧縮パッケージの保存場所
zipStorePath //distributionPathに対するGradle圧縮パッケージの保存場所
distributionUrl //Gradleのダウンロードアドレス、一般的には公式サイトのアドレス
以下は Android プロジェクトの Gradle 設定ファイルの例です:
#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
ついでにいくつかの属性値を紹介します:
//ユーザーディレクトリを示し、ユーザーディレクトリの.gradle内のディレクトリ
GRADLE_USER_HOME
//プロジェクトディレクトリを示し、プロジェクト内のgradlewが存在するディレクトリ
PROJECT
これらの値は distributionBase と zipStoreBase の値を設定するために使用できます。
カスタム Wrapper タスク#
Gradle の設定ファイル gradle-wrapper.properties は Wrapper タスクによって生成されます。カスタム Wrapper タスクを使用して gradle-wrapper.properties ファイルを設定することもできます。以下はカスタム Wrapper タスクの一例です:
task wrapper(type: Wrapper){
gradleVersion = '3.3'
distributionBase='GRADLE_USER_HOME'
distributionPath='wrapper/dists'
//注意:こう書かないでください:https\://services...
distributionUrl="https://services.gradle.org/distributions/gradle-3.3-all.zip"
}
これにより、Wrapper を生成する Gradle のバージョンおよび関連する保存ディレクトリを定義できます。
Gradle ログ#
Gradle を使用してプロジェクトを構築する際、関連するログ情報を表示するためにログレベルを指定できます。Gradle のログレベルは主に 6 種類あり、具体的には以下の通りです:
ERROR //エラーメッセージ
QUIET //重要メッセージ
WARNING //警告メッセージ
LIFECYCLE //進捗メッセージ
INFO //情報メッセージ
DEBUG //デバッグ情報
使用時にはコマンドラインの方法でログ表示レベルを制御できます。以下はコマンドで使用できるログオプションの具体例です:
-q または --quiet //QUIETおよびそれ以上のレベルを示す
-i または --info //INFOおよびそれ以上のレベルを示す
-d または --debug //DEBUGおよびそれ以上のレベル(すべてのログを出力)
指定しない場合、デフォルトで出力されるログは LIFECYCLE およびそれ以上のレベルのログです。
ログは主に構築プロセスを追跡し、エラーをデバッグするために使用されます。以下では、プロジェクト構築中のスタック情報の出力と、ログ情報を使用してデバッグする方法を紹介します。
スタック情報の出力#
デフォルトでは、スタック情報の出力はオフになっています。コマンドラインのスタック情報スイッチを使用してそれをオンにすることができます。構築が失敗した場合、Gradle はエラーのスタック情報を出力し、問題の特定と分析を容易にします。具体的には以下の通りです:
-s または --stacktrace //重要なスタック情報を出力
-S または --full--stacktrace //すべてのスタック情報を出力
一般的には - s を使用すれば十分です。
ログ情報のデバッグ#
最も簡単なログ記録は、適切な場所に見たい変数を印刷することです。print 系列のメソッドを使用してログをコンソールに出力できます。これは QUIET レベルのログに該当します。また、内蔵の logger を使用して異なるレベルのログ表示を制御することもできます。DEBUG は最も完全なログを出力し、ERROR は最も少ないログを出力します。使用方法は以下の通りです:
//ログテスト
task hello{
doLast{
println 'Hello world'
print 'Hi'
logger.quiet('quiet ログ')
logger.lifecycle('lifecycle ログ')
logger.error('error ログ')
logger.info('info ログ')
logger.warn('warn ログ')
logger.debug('debug ログ')
}
}
Gradle ログの基本内容は以上です。実際のプロジェクトでの実践が最も重要です。
Gradle コマンドライン#
コマンドラインを使用することで、構築プロセスをある程度理解できます。IDE 上の便利さに比べ、コマンドラインを使用することでその理由を知ることができます。コマンドラインを使用できる場合は、ヘルプを通じて実行可能なコマンドを確認できます。参考は以下の通りです:
gradle -h
gradle -?
gradle -help
上記のコマンドを使用して実行可能なコマンドを確認できます。
実行可能なタスクの確認#
ここでは Wrapper を例に、./gradlew tasks を使用して実行可能なタスクを確認できます。実行結果はグループ形式で出力され、構築に関するタスク(Build Setup tasks)とヘルプに関するタスク(Help tasks)の 2 つがあります。実行結果は以下の通りです:
PS E:\Gradle\study\wrapper> ./gradlew tasks
:tasks
------------------------------------------------------------
All tasks runnable from root project
------------------------------------------------------------
Build Setup tasks
-----------------
init - Initializes a new Gradle build. [incubating]
wrapper - Generates Gradle wrapper files. [incubating]
Help tasks
----------
components - Displays the components produced by root project 'wrapper'. [incubating]
dependencies - Displays all dependencies declared in root project 'wrapper'.
dependencyInsight - Displays the insight into a specific dependency in root project 'wrapper'.
help - Displays a help message.
model - Displays the configuration model of root project 'wrapper'. [incubating]
projects - Displays the sub-projects of root project 'wrapper'.
properties - Displays the properties of root project 'wrapper'.
tasks - Displays the tasks runnable from root project 'wrapper'.
To see all tasks and more detail, run gradlew tasks --all
To see more detail about a task, run gradlew help --task <task>
BUILD SUCCESSFUL
Total time: 8.4 secs
特定のタスクのヘルプを確認#
Gradle には組み込みの help タスクがあり、このタスクを使用して特定のタスクの使用ヘルプを確認できます。具体的なコマンドは以下の通りです:
//コマンド形式
gradle help --task タスク名
//例
gradle help --task projects
実行結果は以下の通りです:
PS E:\Gradle\study\wrapper> gradle help --task projects
> Task :help
Detailed task information for projects
Path
:projects
Type
ProjectReportTask (org.gradle.api.tasks.diagnostics.ProjectReportTask)
Description
Displays the sub-projects of root project 'wrapper'.
Group
help
BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
タスクのヘルプ情報を通じて、現在のタスクのグループ、タイプ、および追加パラメータを確認できます。
さらに、開発中にしばしばサードパーティライブラリを使用するため、サードパーティ依存関係を強制的に更新する方法についても説明します。プロジェクトを構築する際に --refresh-dependencies パラメータを追加することで実現できます。また、複数のタスクを同時に実行する必要がある場合は、具体的なタスクをスペースで区切って指定します。例えば、./gradlew t1 t2 のようにします。Gradle はキャメルケースの省略呼び出しを提供しており、以下のように簡略化して呼び出すことができます:
//タスク
newTask
//コマンド
./gradlew nt
まとめ#
これは Gradle の初歩的な記事であり、Gradle および関連コマンドについて一定の理解を得ることができました。これは今後 Gradle を使用してプロジェクトを構築するための基礎となります。Gradle の学習について、このシリーズを完結させることができることを願っています。