Gradleを試してみる
Gradleはビルドシステムの一つです。他にはmakeやAntやMavenがあります。
ダウンロード
公式ページからダウンロードします。
インストール
インストールとはいいつつダウンロードした.zipファイルを適当な場所に配置して環境変数PATHにbinフォルダを追加するだけです。
gradle -v でバージョン情報を確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
> gradle -v ------------------------------------------------------------ Gradle 2.13 ------------------------------------------------------------ Build time: 2016-04-25 04:10:10 UTC Build number: none Revision: 3b427b1481e46232107303c90be7b05079b05b1c Groovy: 2.4.4 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 |
hello world
Hello worldしてみます。
1 2 3 4 5 |
task hello { doLast { println <span class="hl-string">'Hello world!'</span> } } |
以下のコマンドで実行してみます。
1 2 |
> gradle -q hello Hello world! |
タスクの定義はもう少しシンプルに書けるよう。
1 2 3 |
task hello << { println 'Hello world!' } |
groovyなコードが実行できます。
1 2 3 4 5 |
task upper << { String someString = 'mY_nAmE' println "Original: " + someString println "Upper case: " + someString.toUpperCase() } |
実行結果
1 2 3 |
> gradle -q upper Original: mY_nAmE Upper case: MY_NAME |
groovyには4.timesなイケてる記述ができるんですね。
1 2 3 |
task count << { 4.times { println "$it " } } |
実行結果
1 2 3 4 5 |
> gradle -q count 0 1 2 3 |
タスクの依存関係
1 2 3 4 5 6 |
task hello << { println 'Hello world!' } task intro(dependsOn: hello) << { println "I'm Gradle" } |
実行結果。introはhelloに依存しておりintroが実行される前にhelloが実行されているのがわかりますね。helloに依存関係は無いのでhelloのみが実行されています。
1 2 3 4 5 |
> gradle -q hello Hello world! > gradle -q intro Hello world! I'm Gradle |
先ほどのコード、タスクの順番を入れ替えた場合はどうなるでしょうか。
1 2 3 4 5 6 |
task intro(dependsOn: hello) << { println "I'm Gradle" } task hello << { println 'Hello world!' } |
dependsOnでhelloタスクを指定していますが、helloタスクはまだ読み込まれていません。そのため、実行結果ではエラーとなりました。
1 2 3 |
> gradle -q intro FAILURE: Build failed with an exception. |
回避方法としてはdependsOnで指定する値を文字列にしておくと良いようです。
1 2 3 4 5 6 |
task intro(dependsOn: 'hello') << { println "I'm Gradle" } task hello << { println 'Hello world!' } |
dependsOn: ‘hello’に変更しました。この場合は実行できていますね。
1 2 3 |
> gradle -q intro Hello world! I'm Gradle |
動的なタスク
文字列でタスク名を指定しましたが、動的にタスクを作ることもできるようです。
1 2 3 4 5 |
4.times { counter -> task "task$counter" << { println "I'm task number $counter" } } |
実行結果は以下。task1から4までを生成できているようですね。
1 2 3 4 5 6 7 |
> gradle -q task1 I'm task number 1 > gradle -q task4 I'm task number 4 > gradle -q task5 FAILURE: Build failed with an exception. |
追記
タスクの内容は後から追記できるようです。
1 2 3 4 5 6 |
task hello << { println 'Hello world!' } hello << { println "日本語でも はろーわーるど" } |
実行結果
1 2 3 |
> gradle -q hello Hello world! 日本語でも はろーわーるど |
プロパティ
プロパティを読み書きできるようです。
1 2 3 4 5 6 7 |
task myTask { ext.myProperty = "myValue" } task printTaskProperties << { println myTask.myProperty } |
実行結果
1 2 |
> gradle -q printTaskProperties myValue |
Antの実行
なんとAntを実行することができます。これまで作っていたbuild.xmlファイルを実行するラッパーファイルbuild.gradleを作ることで、ゆるやかに移行していくことが可能です。
試しに以下のbuild.xml(antファイル)を呼び出します。
1 2 3 4 5 6 7 8 |
<project> <target name="target1"> <echo message="Hello, ant world1" /> </target> <target name="target2"> <echo message="Hello, ant world2" /> </target> </project> |
1 |
ant.importBuild 'build.xml' |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
> gradle target1 :target1 [ant:echo] Hello, ant world1 BUILD SUCCESSFUL Total time: 1.651 secs > gradle target2 :target2 [ant:echo] Hello, ant world2 BUILD SUCCESSFUL Total time: 1.781 secs |
次はJavaビルドあたりを試したいところ。
参考資料
http://gradle.monochromeroad.com/docs/userguide/userguide_single.html#ant