Как последовательно выполнить gradle-задание с использованием скриптов sh внутри - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть 2 задачи, одна зависит от другой.

Первая задача - получить дб с удаленного сервера, используя скрипт sh.Вторая задача анализирует дамп из предыдущей задачи.

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

Задачи:

task getDumpFromRemotePostgres(type: Exec) {

    executable = "/bin/sh"
    println 'started task getDumpFromRemotePostgres'

    def dumpScript = './createSqliteDb/scripts/dump_db_script.sh'
    def dbDumpFileName = 'dump.sql'
    args += [dumpScript]

    println 'finished task getDumpFromRemotePostgres'       
}


task patchPostgresDumpFile(type: Exec) {
    dependsOn getDumpFromRemotePostgres

    executable = "/bin/sh"

    println 'started task patchPostgresDumpFile'

    def dbDumpFileName = 'dump.sql'
    File dumpFile = file(dbDumpFileName)
    def line
    dumpFile.withReader { reader ->
        while ((line = reader.readLine()) != null) {

       //parse and modify
    }

    println 'finished task patchPostgresDumpFile'
}

Скрипт dump_db_script.sh:

echo "dump script started"

pg_dump --data-only --inserts --dbname=postgresql://user:pas@server/base_name > dump.sql

echo "dump script finished"

Журнал консоли является следующим (если я удаляю строки файла доступа):

started task getDumpFromRemotePostgres
finished task getDumpFromRemotePostgres
started task patchPostgresDumpFile
finished task patchPostgresDumpFile

> Task :getDumpFromRemotePostgres
dump script started
dump script finished

Есть какие-нибудь идеи, как решить проблему?

Пробовал с doLast {...} но ни к чему не привели

1 Ответ

0 голосов
/ 08 февраля 2019

Кажется, это все из-за разных этапов жизненного цикла.Вы можете прочитать больше об этом здесь .

Прежде всего, когда вы создаете задачу типа Exec или любого вида без <<, все в его теле - это конфигурация задачии выполняется в pahse конфигурации сборки.Вот почему в вашем выводе появляются сообщения типа started task getDumpFromRemotePostgres.

Во-вторых, исполняемый файл, который вы запускаете, выполняется на этапе выполнения, после того, как все задачи задачи уже выполнены.И именно поэтому dump script started появляется после того, как все настройки выполнены.

В вашем случае вам не нужно объявлять patchPostgresDumpFile как задачу Exec, потому что вы на самом деле не вызываетелюбой исполняемый файл, но нужно запустить некоторую логику.Для этого вам нужно переместить эту логику в замыкание doLast, чтобы запустить ее на этапе выполнения.Примерно так:

task patchPostgresDumpFile() {
    dependsOn getDumpFromRemotePostgres

    doLast {
      println 'started task patchPostgresDumpFile'

        def dbDumpFileName = 'dump.sql'
        File dumpFile = file(dbDumpFileName)
        def line
        dumpFile.withReader { reader ->
            while ((line = reader.readLine()) != null) {

           //parse and modify
        }

        println 'finished task patchPostgresDumpFile'
    }

}

И обратите внимание, что ваше сообщение started task getDumpFromRemotePostgres на самом деле не означает, что эта задача выполняется, а что она настраивается.Если вы хотите получать сообщения до и после выполнения, переместите их в замыкания doFirst и doLast в закрытии конфигурации задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...