Как проверить текущее содержимое файла в 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
}
}
}