Пользовательская условная конфигурация для проекта Gradle

Имея выдержку из 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,...), поэтому я полагаю, что у меня здесь что-то не так.

Может кто-нибудь объяснить, как сделать это configs условным на основе какого-то внешнего параметра?

Ответы

Ответ 1

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) { ... } 

Другой, более простой способ решить эту проблему - проверить, содержится ли конкретное имя задачи в gradle.startParameter.taskNames. Однако это имеет два ограничения: во-первых, оно сравнивает имена задач, которые могут повлиять на многопроектные сборки. Во-вторых, он найдет только задачи, которые были указаны непосредственно (например, в командной строке), но не зависят от них.

PS: В вашем коде isDevBuild всегда выполняется, потому что (не нулевое) замыкание true согласно истине Groovy. (В отличие от isDevBuild(), isDevBuild не вызывает замыкание.)