Gradle Liquibase插件增量构建异常:clean后任务仍标记为UP-TO-DATE
Liquibase Gradle插件clean后任务仍标记为UP-TO-DATE的解决方案
问题原因
你配置的outputs.dirs包含了$rootDir/liquibase/src/main/resources这个静态资源目录——该目录在执行clean命令后完全不受影响,Gradle会判定任务的输出并未全部丢失,因此标记为UP-TO-DATE。
另外,Liquibase任务的核心执行结果是数据库中的变更记录,而非本地文件,用本地目录作为输出无法准确反映数据库状态的变化(比如clean后重启的空数据库)。
而composeUp、generateJooq等任务能正常重新执行,是因为它们的核心输出就是build/generated下的文件,clean后该目录被删除,Gradle能检测到输出缺失,从而触发任务重新运行。
解决方案
方案1:调整输入输出配置,只关联动态生成目录
将静态资源目录改为任务输入(跟踪迁移文件变化),仅保留build/generated作为输出:
tasks.withType(org.liquibase.gradle.LiquibaseTask) { // 迁移文件目录作为输入,文件变化时触发任务 inputs.dir("$rootDir/liquibase/src/main/resources") // 仅将动态生成目录作为输出,clean后该目录消失,任务会重新执行 outputs.dir("build/generated") }
这个方案适合数据库状态和build/generated强绑定的场景(比如你用jOOQ基于生成的代码,数据库空时build/generated也会为空)。
方案2:添加执行标记文件跟踪任务状态
创建一个专门的标记文件来记录Liquibase的执行状态,clean后该文件被删除,Gradle会触发任务重新执行:
tasks.withType(org.liquibase.gradle.LiquibaseTask) { def liquibaseMarker = file("build/liquibase/liquibase-executed.marker") // 迁移文件作为输入,跟踪变更 inputs.dir("$rootDir/liquibase/src/main/resources") // 标记文件作为输出,clean后丢失会触发任务 outputs.file(liquibaseMarker) doLast { // 任务执行成功后生成标记文件 liquibaseMarker.parentFile.mkdirs() liquibaseMarker.text = new Date().toString() } }
这个方案更灵活,能准确跟踪Liquibase是否执行过,同时兼顾迁移文件变化的场景。
方案3:强制任务每次执行(适合开发环境)
如果是开发环境,可直接禁用增量构建检查,让任务每次都执行:
tasks.withType(org.liquibase.gradle.LiquibaseTask) { dependsOn composeUp // 忽略UP-TO-DATE检查,强制每次执行 outputs.upToDateWhen { false } }
注意:此方案会降低构建效率,不建议在生产环境使用。
内容的提问来源于stack exchange,提问作者jarasez
相关产品推荐
相关产品推荐

