Gradle で評価時の依存を定義するには evaluationDependsOn を使う


f:id:Naotsugu:20150224234525p:plain

Gradle のマルチプロジェクトで、ビルドスクリプトの評価順序を定義するには evaluationDependsOn を使う。

ビルド成果物の依存は dependencies

settings.gradle で以下のようにマルチモジュールプロジェクトを定義していたとする。

include 'war', 'app'

ビルド成果物の依存は、ルートプロジェクトの build.gradle で以下のように定義できる。

project(':war') {
    dependencies {
    }
}

project(':app') {
    dependencies {
        compile project(':war')
    }
}

この場合、ビルド処理の順番は war → app となる。

タスク間の実行時依存関係は dependsOn

app プロジェクトのタスクの前に、war プロジェクトの action タスクを実行する必要がある場合は、以下のように dependsOn で実行時依存を定義する。

task action(dependsOn: ':war:action') << {
}

評価時の依存は evaluationDependsOn

war プロジェクトで archiveName を以下のように定義し、

war {
    archiveName 'app.war'
}

app プロジェクトで project(':war').war.archivePath.path のように参照しても、war プロジェクトで定義する前のデフォルト値しか参照できない。

apply plugin: 'java'
apply plugin: 'application'

mainClassName = "app.Main"
run {
    args project(':war').war.archivePath.path
}

ビルドスクリプトの評価の順番はプロジェクト名のアルファベット順になるためである。

評価時の順序を定義するには、以下のように evaluationDependsOn を指定する。

apply plugin: 'java'
apply plugin: 'application'

evaluationDependsOn(':war')

mainClassName = "app.Main"
run {
    args project(':war').war.archivePath.path
}

こうすることで、先に war プロジェクトの評価後の値が、app プロジェクトで参照できる。