Gradle のビルドファイル (build.gradle) 内で各種ディレクトリへのパスを取得するためのメモ。
プロジェクトのルートディレクトリのような、プロジェクトに関するディレクトリは project オブジェクトのプロパティ、もしくはビルドスクリプト自体のプロパティとして取得できます。 一方、Gradle のインストール・ディレクトリのような Gradle に関するディレクトリは gradle オブジェクトのプロパティとして取得できます。
ちょっと具体的なディレクトリ構造を設定して話を進めた方がいいと思うので、以下のようなディレクトリ構造を想定します:
C:
- gradle
- gradle-1.12 ・・・ 【gradle.gradleHomeDir】
- Users
- waman ・・・ 【Sydtem.getProperty("user.home")】
- .gradle ・・・ 【gradle.gradleUserHomeDir】
- workspace
- gradle-test ・・・ 【rootDir, projectDir】
- build.gradle
- Gradle 1.12 が C:/gradle 下にインストールされている
- Java のシステム・プロパティ "user.home" は C:/Users/waman を参照しているとする
- Gradle プロジェクト gradle-test は C:/Users/waman/workspace 下に作成されている
とします。 で、gradle-test プロジェクトにあるビルドファイルの内容は以下のようであるとします:
// build.gradle task hello << { println 'Hello, Gradle!' } println "|rootDir |$rootDir|" // $rootDir の代わりに $project.rootDir でも OK println "|projectDir |$projectDir|" println "|buildDir |$buildDir|" println "|gradleHomeDir |$gradle.gradleHomeDir|" println "|gradleUserHomeDir|$gradle.gradleUserHomeDir|"
hello タスクはビルドを実行するためのタスクです。 で、gradle-test ディレクトリ下で
gradle hello
のようにビルドを実行するとしましょう。 このとき、以下のような内容が表示されます:
プロパティ | 上記の例での値 | よく使われる環境変数 で表した場合*1 |
---|---|---|
rootDir | C:/Users/waman/workspace/gradle-test | ${PROJECT_DIR} |
projectDir | C:/Users/waman/workspace/gradle-test | ${PROJECT_DIR} |
buildDir | C:/Users/waman/workspace/gradle-test/build | ${PROJECT_DIR}/build |
gradleHomeDir | C:/gradle/gradle-1.12 | ${GRADLE_HOME} |
gradleUserHomeDir | C:/Users/waman/.gradle | ${user.home}/.gradle |
「よく使われる環境変数で表した場合」というのは表示には関係ありません。 また、デフォルトで定義されているわけでもありません。
- gradle.gradleHomeDir はよく環境変数 GRADLE_HOME に設定するディレクトリで、環境変数 PATH に ${GRADLE_HOME}/bin を設定するやつですね。
- gradle.gradleUserHomeDir はリモート・リポジトリから自動ダウンロードしたライブラリを格納しておくディレクトリです。 Gradle のデフォルトのローカル・リポジトリ。
- buildDir はビルドの成果物を格納しておくディレクトリです。
rootDir と projectDir の違いはマルチプロジェクトを扱うときに出てきます。 次節参照。 また、java プラグインなどを適用すると、上記のプロパティ以外にもいろいろディレクトリ関連のプロパティが追加されます、だいたいは project オブジェクトに*2。 gradle オブジェクトにはあまり追加されないと思います。
マルチプロジェクト
上記のシングルプロジェクトでは rootDir と projectDir は同じディレクトリを指していましたが、マルチプロジェクトでは一般にこれらの値は変わります。 また、具体的なディレクトリ構造で考えていきましょう:C:
- gradle
- gradle-1.12 ・・・ 【gradle.gradleHomeDir】
- Users
- waman ・・・ 【System.getProperty("user.home")】
- .gradle ・・・ 【gradle.gradleUserHomeDir】
- workspace
- gradle-test ・・・ 【rootDir, projectDir】
- build.gradle
- settings.gradle
- api
- impl
gradle-test プロジェクトをルート・プロジェクトとして、そのサブプロジェクトとして api プロジェクトと impl プロジェクトを作りました。 settings.gradle はサブプロジェクトを指定します:
// settiings.gradle include 'api', 'impl'
で、gradle-test 下の build.gradle が以下のようであったとしましょう:
task hello << { println 'Hello, Gradle!' } println "|rootDir |$rootDir|" println "|projectDir |$projectDir|" println "|buildDir |$buildDir|" println() subprojects{ println "project[$it.name]" println "|rootDir |$rootDir|" println "|projectDir|$projectDir|" println "|buildDir |$buildDir|" println() }
このとき、出力は
gradle-test プロジェクト(ルート・プロジェクト)
プロパティ | 上記の例での値 |
---|---|
rootDir | C:/Users/waman/workspace/gradle-test |
projectDir | C:/Users/waman/workspace/gradle-test |
buildDir | C:/Users/waman/workspace/gradle-test/build |
api プロジェクト
プロパティ | 上記の例での値 |
---|---|
rootDir | C:/Users/waman/workspace/gradle-test |
projectDir | C:/Users/waman/workspace/gradle-test/api |
buildDir | C:/Users/waman/workspace/gradle-test/api/build |
impl プロジェクト
プロパティ | 上記の例での値 |
---|---|
rootDir | C:/Users/waman/workspace/gradle-test |
projectDir | C:/Users/waman/workspace/gradle-test/impl |
buildDir | C:/Users/waman/workspace/gradle-test/impl/build |
となります。 rootDir はどのプロジェクトからも常に同じルート・プロジェクトが参照されます。 projectDir は各プロジェクトのディレクトリが、buildDir はそのディレクトリかの build ディレクトリ(デフォルトで)が参照されます。 まぁ、そのままですね。
gradlew
ちなみに、build.gradle を// build.gradle task hello << { println 'Hello, Gradle!' } println "|rootDir |$rootDir|" println "|projectDir |$projectDir|" println "|buildDir |$buildDir|" println "|gradleHomeDir |$gradle.gradleHomeDir|" println "|gradleUserHomeDir|$gradle.gradleUserHomeDir|" task wrapper(type: Wrapper) { gradleVersion = "1.12" }
として、まず
gradle wrapper
と実行した後、
gradlew hello
のように gradlew コマンドによって Gradle を実行すると
プロパティ | 上記の例での値 |
---|---|
rootDir | C:/Users/waman/workspace/gradle-test |
projectDir | C:/Users/waman/workspace/gradle-test |
buildDir | C:/Users/waman/workspace/gradle-test/build |
gradleHomeDir | C:/Users/waman/.gradle/wrapper/dists/gradle-1.12-bin/.../gradle-1.12 |
gradleUserHomeDir | C:/Users/waman/.gradle |
のように gradleHomeDir、つまり Gradle がインストールされているディレクトリだけ変更されます。 Gradle 自体がダウンロードされて実行されるので、gradleUserHomeDir 下になります。
GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)
- 作者: 大塚弘記
- 出版社/メーカー: 技術評論社
- 発売日: 2014/03/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (6件) を見る
Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)
- 作者: 佐藤聖規,和田貴久,河村雅人,米沢弘樹,山岸啓,川口耕介
- 出版社/メーカー: 技術評論社
- 発売日: 2011/11/11
- メディア: 単行本(ソフトカバー)
- 購入: 26人 クリック: 496回
- この商品を含むブログ (62件) を見る