Как проверить текущее содержимое файла в Gradle

Сначала и формость... Я новичок в Gradle. Сказав это, я люблю это. К сожалению, я наткнулся на препятствие. У меня есть ряд задач, которые являются частью процесса развертывания. Один (buildProject) Вызывает скрипт оболочки, который как часть процесса обновляет REVISION файл с новой "версией". После этого deployToRemote Задача вызывается для развертывания последней версии на сервере. Это вызывает getCurrentVersion прочитать последнюю версию с REVISION файл. Все эти задачи изложены ниже. Проблема в том, что кажется, что getLatestVersion называется первым, несмотря на правильное mustRunAfter заявления, как это всегда читается в "PRE" buildProject версия указана в REVISION файл. Как я могу убедиться, что getLatestVersion читает файл после buildProject работает?

Вот задачи:

buildProject:

task buildProject(type:Exec) {
  def command = ['./make-release', '-f']
  if (deployEnvironment != 'stage') {
    command = ['./make-release', "-e ${deployEnvironment}"]
  }

  commandLine command
}

deployToRemote

task deployToRemote(dependsOn: 'getCurrentVersion') {
  doLast {
    def version = tasks.getCurrentVersion.hash()
    println "Using version ${version}"
    println "Using user ${webhostUser}"
    println "Using host ${webhostUrl}"
    ssh.run {
      session(remotes.webhost) {
        put from: "dist/project-${version}.tar.gz", into: '/srv/staging/'
        execute "cd /srv/staging; ./manual_install.sh ${version}"
      }
    }
  }
}

getCurrentVersion

task getCurrentVersion {
  def line
  new File("REVISION").withReader { line = it.readLine() }
  ext.hash = {
    line
  }
}

мой build.gradle Файл имеет это в конце:

deployToRemote.mustRunAfter buildProject
getCurrentVersion.mustRunAfter buildProject

REVISION файл выглядит так;

1196.dev10
919b642fd5ca5037a437dac28e2cfac0ea18ceed
dev

1 ответ

Решение

Сборка Gradle состоит из трех этапов: инициализация, настройка и выполнение.

Проблема, с которой вы столкнулись, заключается в том, что код в getCurrentVersion выполняется в фазе конфигурации. На этапе настройки код в задачах выполняется в порядке их определения и зависимости не учитываются.

Рассмотрим этот пример:

task second(dependsOn: 'first') {
    println 'second: this is executed during the configuration phase.'
    doLast {
      println 'second: This is executed during the execution phase.'
    }
}

task first {
    println 'first: this is executed during the configuration phase.'
    doLast {
      println 'first: This is executed during the execution phase.'
    }
}

second.mustRunAfter first

Если вы выполните gradle -q second ты получишь:

second: this is executed during the configuration phase.
first: this is executed during the configuration phase.
first: This is executed during the execution phase.
second: This is executed during the execution phase.

Чтобы исправить ваш скрипт, вам нужно поместить код в doLast как это:

task getCurrentVersion {
  doLast {
     def line
     new File("REVISION").withReader { line = it.readLine() }
     ext.hash = {
       line
     }
  }
}
Другие вопросы по тегам