15

https://github.com/gradle/gradle/blob/master/build.gradleからの抜粋があります:

ext {
  isDevBuild = {
    gradle.taskGraph.hasTask(developerBuild)
  }
}

task developerBuild {
  description = 'Builds distributions and runs pre-checkin checks'
  group = 'build'
  dependsOn testedDists
}

このアプローチを使用してプロジェクトでカスタム構成を作成したとき、次のことがわかりました。

isDevBuild === true

つまり、タスク'developerBuild'は私のbuild.gradleプロジェクト内にあり、したがってグラフ内にあるため、常に真です。それらにはいくつかの「異なる」構成(isCIBuild、isCommitBuild、isFinalReleaseBuildなど)があるので、ここで何か問題が発生したと思います。

誰かがこの設定を外部パラメータに基づいて条件付きにする方法を説明できますか?

4

1 に答える 1

40

taskGraph.hasTask()タスクがタスク実行グラフにあるかどうか、つまり実行されるかどうかを示します。タスク実行グラフは構成フェーズの後でのみ作成されるため、このメソッドはwhenReadyコールバックから(または実行フェーズで)呼び出す必要があります。

gradle.taskGraph.whenReady { graph ->
    if (graph.hasTask(developerBuild)) { 
        // do conditional configuration
    }
} 

これを読みやすくするために、新しい方法を導入できます。

def onlyFor(task, config) {
    gradle.taskGraph.whenReady { graph ->
        if (graph.hasTask(task)) { 
            project.configure(project, config)
        }
    }
}

今、私たちは書くことができます:

onlyFor(developerBuild) { ... }
onlyFor(ciBuild) { ... } 

この問題を解決するもう1つの簡単な方法は、特定のタスク名がに含まれているかどうかを確認することgradle.startParameter.taskNamesです。ただし、これには2つの制限があります。1つは、タスクを比較することです。これにより、マルチプロジェクトビルドに違いが生じる可能性があります。次に、直接(コマンドラインなどで)指定されたタスクのみが検出され、その依存関係は検出されません。

PS:コードでは、(null以外の)クロージャはGroovyの真実に従ってisDevBuildいるため、常に成り立ちます。true(とは対照的にisDevBuild()isDevBuildクロージャとは呼ばれません。)

于 2012-05-11T17:20:58.063 に答える