Пропуск зависимостей задачи Gradle, если эта задача актуальна - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь перевести сборку на gradle, и у меня есть одна проблема, которая приводит меня в кеш сборки.У меня есть набор зависимых задач, которые используются для:

  • установки встроенного сервера MySQL
  • переноса схемы на этом сервере с помощью Flyway
  • генерации кода Jooq изэта схема
  • останавливает встроенный сервер MySQL
  • компилирует этот сгенерированный код с кодом нашего приложения

Весь этот процесс работает нормально, но я хочу понять кэш сборкии как это работает.Соответствующая часть моего build.gradle выглядит примерно так:

plugins {
    id 'java'
    id 'nu.studer.jooq' version '2.0.11'
    id "org.flywaydb.flyway" version "5.2.4"
    id 'com.github.michaelruocco.embedded-mysql-plugin' version '2.1.10'
}

embeddedMysql {
    url = 'jdbc:mysql://127.0.0.1:3308/jooqGeneration'
    username = 'user'
    password = 'password'
    version = 'v5_7_latest'
}
startEmbeddedMysql.inputs.files(project.fileTree(dir: "src", include: "**/*.sql"))
startEmbeddedMysql.outputs.dir('build/generated-src/jooq/')

flyway {
    url = 'jdbc:mysql://127.0.0.1:3308/jooqGeneration'
    user = 'user'
    password = 'password'
    schemas = ['jooqGeneration']
}
flywayMigrate.dependsOn 'startEmbeddedMysql'
flywayMigrate.outputs.upToDateWhen { !startEmbeddedMysql.didWork }

jooq {
    sample(sourceSets.jooqSchemaGeneration) {
        jdbc {
            driver = 'org.mariadb.jdbc.Driver'
            url = 'jdbc:mysql://127.0.0.1:3308'
            user = 'user'
            password = 'password'
        }
        generator {
            name = 'org.jooq.util.DefaultGenerator'
            database {
                name = 'org.jooq.util.mysql.MySQLDatabase'
                includes = '.*'
                excludes = ''
                inputSchema = 'jooqGeneration'
            }
        }
    }
}
generateSampleJooqSchemaSource.dependsOn 'flywayMigrate'
generateSampleJooqSchemaSource.finalizedBy 'stopEmbeddedMysql'
generateSampleJooqSchemaSource.outputs.upToDateWhen { !flywayMigrate.didWork }

compileJava.dependsOn 'generateSampleJooqSchemaSource'

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

Все это, кажется, связано с тем фактом, что даже если задача актуальна, задачи, от которых зависит эта задача, все еще выполняются.Если я добавлю некоторые входы и выходы в задачу generateSampleJooqSchemaSource, она будет правильно определять, является ли она актуальной, но даже если задача актуальна, задачи dependsOn все равно запускаются.Это означает, что мне нужно переходить к каждому зависимому шагу и обрабатывать его при запуске.Я решил это, посмотрев, выполняет ли каждый зависимый шаг какую-либо работу, и затем добавил обновляемые файлы в первую задачу, где я запускаю встроенный сервер MySQL.

Есть ли способ перенести все это решение?сделать до окончательного generateSampleJooqSchemaSource, чтобы задачи dependsOn выполнялись только в том случае, если generateSampleJooqSchemaSource не обновлен?

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

В основном я просто хочу понять кэш сборки Gradle и как он решает запустить ихзадачи.

1 Ответ

1 голос
/ 14 мая 2019

Связи задач и упорядочение происходят, когда Gradle определяет, что запускать, на данный момент нет обновленной концепции.

Как только граф задач будет вычислен, Gradle выполнит все задачи в соответствующем порядке, теперь проверяя, нужно ли что-то для них сделать.

Одним из способов решения вашей проблемы было бы убедиться в том, что то, что приводит к актуальности вашей задачи generateSampleJooqSchemaSource, также приводит к обновлению ее зависимостей.

Или вы можете добавить задачу, от которой зависят все эти задачи, которая затем выведет некоторый контент, который будет использоваться последующими задачами в цепочке, в качестве их современной проверки, что приведет к их пропуску.

...