Gradle中确保schema:migrate在schema或codegen变更时重新执行
解决Gradle多项目中codegen变更时schema:migrate未执行的问题
核心问题在于:schema:migrate任务的增量构建判断仅依赖schema项目自身的输入输出,当codegen项目变更时,Gradle认为该任务无需重新执行,但CI环境是无状态的,没有留存之前的数据库迁移结果,导致codegen:generate因数据库未初始化失败。
以下是两种可靠的解决方案:
方案一:将codegen项目文件纳入schema:migrate的输入依赖
通过让schema:migrate任务感知codegen项目的变更,只要codegen的代码或配置发生变化,就触发migrate任务重新执行。在schema项目的build.gradle中添加配置:
tasks.named('migrate') { // 监听codegen项目的主源代码变更 inputs.files(project(':codegen').sourceSets.main.allSource) // 监听codegen项目的构建配置文件变更 inputs.files(project(':codegen').files('build.gradle', 'settings.gradle')) }
这样,当codegen项目的任何源代码或构建配置修改时,schema:migrate的输入集合会发生变化,Gradle会自动标记该任务需要重新执行,确保CI环境中数据库处于最新状态供codegen使用。
方案二:禁用schema:migrate的构建缓存(备选)
如果不需要对schema:migrate任务使用远程构建缓存,可以直接禁用该任务的缓存特性,确保每次构建都执行迁移:
tasks.named('migrate') { outputs.cacheIf { false } }
这种方法简单直接,但会牺牲schema项目无变更时的缓存效率,仅推荐在方案一不适用的场景下使用。
验证方法
修改codegen项目中的任意代码或配置文件,执行./gradlew app:build,观察schema:migrate任务是否会被触发执行,后续codegen:generate是否能正常完成。
内容的提问来源于stack exchange,提问作者mako-taco
相关产品推荐
相关产品推荐

