我正在尝试将构建迁移到gradle,但是有一个问题使我无法使用构建缓存。我有一组依赖的任务,这些任务用于:
这整个过程工作正常,但是我想了解构建缓存及其工作方式。我的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构建缓存,以及它如何决定运行这些任务。
答案 0 :(得分:1)
当Gradle确定要运行的内容时,任务关系和顺序就会发生,那时还没有最新的概念。
计算完任务图后,Gradle将以适当的顺序执行所有任务,现在检查是否需要为它们做任何事情。
解决问题的一种方法是确保使generateSampleJooqSchemaSource
任务最新的原因也导致其依赖项也最新。
或者您可以添加所有这些任务所依赖的任务,然后将输出一些内容以供链中的后续任务用作最新检查,从而使它们被跳过。