倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

Gradle のディレクトリ関連プロパティ

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)

GitHub実践入門 ~Pull Requestによる開発の変革 (WEB+DB PRESS plus)

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

Jenkins実践入門 ?ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

*1:Ant 風プロパティ

*2:reportsDir とか libs ディレクトリとか。