Gradle задача не должна выполняться автоматически

Я определяю задачу в gradle:

task releaseCandidate(type: Exec) {
    commandLine 'git', 'checkout', 'develop'

    // Increment version code in Manifest
    String manifest = new File('AndroidManifest.xml').getText('UTF-8')
    Pattern pattern = Pattern.compile('android:versionCode="([0-9]+)"')
    Matcher matcher = pattern.matcher(manifest)
    matcher.find()
    int newVersionCode = Integer.parseInt(matcher.group(1)) + 1
    manifest = manifest.replaceAll(
        "android:versionCode=\"([0-9]+)\"", "android:versionCode=\"$newVersionCode\""
    )
    new File('AndroidManifest.xml').write(manifest, 'UTF-8')

    commandLine 'git', 'diff'
}

Что я хочу выполнить только тогда, когда я прямо называю его gradle releaseCandidate. Однако, когда я запускаю любую другую задачу, например gradle assembleDebug, она также запускает задачу releaseCandidate. Я не хочу, чтобы такое поведение происходило. Нет задачи в зависимости от releaseCandidate или наоборот.

Мой проект - приложение для Android, поэтому я использую плагин android gradle.

Ответы

Ответ 1

Обычная ловушка. Добавьте действие к задаче, иначе код будет запущен на этапе конфигурации. Пример задачи с действием:

task sample << {
}

Как я вижу, вам лучше написать настраиваемую задачу, чем использовать тип Exec. Я полагаю, что это недействительно для определения commandLine дважды.

Ответ 2

Вы смешиваете конфигурацию задач и код groovy. Все, что является частью основного определения задачи, будет выполнено на этапе конфигурации. task task1 << { code } является сокращением для


task task1 {
  doLast {
    code
  }
}

commandLine является частью Exec Task, но ваш другой код не является и должен быть заключен в doLast, это сначала выполнит командную строку, а затем выполнит ваш дополнительный код. Если вам нужен другой exec commandLine, вам понадобится другая задача.


task releaseCandidate(type: Exec) {
    commandLine 'git', 'checkout', 'develop'

    doLast {
    // Increment version code in Manifest
    String manifest = new File('AndroidManifest.xml').getText('UTF-8')
    Pattern pattern = Pattern.compile('android:versionCode="([0-9]+)"')
    Matcher matcher = pattern.matcher(manifest)
    matcher.find()
    int newVersionCode = Integer.parseInt(matcher.group(1)) + 1
    manifest = manifest.replaceAll(
        "android:versionCode=\"([0-9]+)\"", "android:versionCode=\"$newVersionCode\""
    )
    new File('AndroidManifest.xml').write(manifest, 'UTF-8')
    }
}

Ответ 3

Просто для завершения ответа @Opal для случаев, когда действительно используется Exec (например, ссылка CommandLine):

task task1 << {
   exec {
        List<String> arguments = new ArrayList<String>()
        //..
        commandLine arguments
   }
}