Я пытаюсь перевести сборку на 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 и как он решает запустить ихзадачи.