読者です 読者をやめる 読者になる 読者になる

GradleのdependenciesをSnapshotビルドとReleaseビルドで切り替えたい

Gradle

やりたい事

  • build.gradleに記述しているdependenciesの中で参照している自作のライブラリがあるが、開発中の時はライブラリがSNAPSHOTの時もある。
  • リリースをするときは基本的にSNAPSHOT無しのライブラリを使う。
  • いちいち書き換えてコミットするのはなんだかなー。
  • タスクで切り替えられるように出来るんじゃ?

ダメだったこと

  • dependenciesの中で指定しているjarファイルのversionに拡張プロパティで定義したプロパティを指定して、gradle.taskGraph.whenReadyの中で切り替えようとしたらダメだった。
    • 調べたらdependenciesはタスクが動いた時に定義されて後から書き換わらないような感じ。

やったこと

  • gradle.taskGraph.whenReadyの中で切り替えたいdependenciesをまるごと定義してみた。→上手くいった!
    • 以下に一部抜粋(このままじゃ動かないかな)
ext {
    // dependencies version
    foo_version = "2.1.0"
    bar_version = "2.2.0"
}

task distribution(type: Copy, dependsOn: jar) {
    // インストーラ作る処理
}
distribution.group 'package'
distribution.description 'Copies snapshot installer'

task release(dependsOn: distribution) << {
}
release.group 'package'
release.description 'Copies release installer'

gradle.taskGraph.whenReady {taskGraph ->
    // リリースじゃないタスクはSNAPSHOTを使う
    if (!taskGraph.hasTask(release)) {
        version = "${version}-SNAPSHOT"
        foo_version = "${foo_version}-SNAPSHOT"
        bar_version = "${bar_version}-SNAPSHOT"
    }
    dependencies {
        compile group: 'com.example.foo', name: 'foo', version: foo_version
        compile group: 'com.example.bar', name: 'bar', version: bar_version
    }
}

dependencies {
    compile group: 'commons-pool', name: 'commons-pool', version: '1.3'
    compile group: 'commons-lang', name: 'commons-lang', version: '2.1'
    runtime group: 'log4j', name: 'log4j', version: '1.2.14'
    testCompile group: 'junit', name: 'junit', version: '4.8.2'
    deployerJars group: 'org.apache.maven.wagon', name: 'wagon-ssh', version: '2.4'
}

調べてもあまり引っかからなかったけど、みんなどうしているんだろう?