Gradle任务执行顺序异常:Finalizer任务提前执行导致失败
Gradle任务顺序问题解决方案
问题核心原因
Gradle的任务调度依赖输入输出的依赖关系,如果apiSpecGenerate没有明确声明生成的文件作为输出,cleanupGenerated也未关联这些输出作为输入,哪怕设置了finalizedBy,Gradle也无法准确判断任务执行顺序,甚至可能并行调度两个任务,导致清理任务在生成文件前就启动。
正确配置步骤
1. 为生成任务声明输出文件/目录
在apiSpecGenerate中明确标记它的产出文件,让Gradle识别任务的执行结果:
task apiSpecGenerate { // 替换为你实际的生成文件目录/路径 outputs.dir "$buildDir/generated/api" doLast { // 这里写入你的OpenAPI生成逻辑,比如调用生成工具 exec { commandLine "openapi-generator-cli", "generate", "-i", "src/main/resources/api.yaml", "-g", "java", "-o", "$buildDir/generated/api" } } }
2. 为清理任务关联生成任务的输出作为输入
让cleanupGenerated依赖apiSpecGenerate的输出,强制Gradle等待生成任务完成后再执行清理:
task cleanupGenerated { // 声明输入为生成任务的输出,建立强依赖关系 inputs.files apiSpecGenerate.outputs.files doLast { // 这里写入你的文件处理逻辑,比如删除冗余文件、修正代码格式等 file("$buildDir/generated/api/unwanted-file.txt").delete() // 其他清理操作... } }
3. 配置finalizer并补充直接依赖
- 保持
finalizedBy确保生成任务完成后自动触发清理:apiSpecGenerate.finalizedBy cleanupGenerated - 如果需要直接执行
cleanupGenerated时也先执行生成任务,补充依赖:cleanupGenerated.dependsOn apiSpecGenerate
验证效果
现在执行以下命令都会遵循正确顺序:
./gradlew apiSpecGenerate:生成任务完成后自动执行清理./gradlew cleanupGenerated:先执行生成任务,再执行清理./gradlew apiSpecGenerate cleanupGenerated:严格按生成→清理的顺序执行
内容的提问来源于stack exchange,提问作者Victor Mikhailov
相关产品推荐
相关产品推荐

