我有两个gradle任务,名为:
apiSpecGenerate -从OpenAPI生成源文件
cleanupGenerated -处理上一个任务的结果(生成的文件应该存在)。
我添加了第二个任务作为第一个任务的终结器,它在第一个任务完成后调用。但事实上,第一个任务被认为已经完成,没有产生任何东西,第二个任务失败了,因为生成的文件不存在。
第一项任务:
val apiSpecGenerateTask = tasks.register("apiSpecGenerate") {
println("!!!!!! GENERATE BEGIN !!!!!!")
description = "Generate a cleaned api spec."
dependsOn(openApiGenerateTaskName)
openApiGenerationTaskNames.forEach { name -> dependsOn(tasks.findByName(name)) }
println("!!!!!! GENERATE END !!!!!!")
}
字符串
第二个任务(终结器)
val cleanupGeneratedFilesTask = tasks.register("cleanupGenerated") {
//dependsOn("apiSpecGenerate")
println("!!!!!! CLEANUP BEGIN !!!!!!")
project.delete(
files("$generatedDtosFolder/org.springframework.data.domain.Pageable.kt"),
files("$generatedDtosFolder/org.springframework.data.domain.PageImpl.kt")
)
val dir = files("$generatedApiFolder/ControllerApi.kt")
//.....
println("!!!!!! CLEANUP END !!!!!!")
}
型
这个不管用!
apiSpecGenerateTask {
finalizedBy(cleanupGeneratedFilesTask)
}
型
结果:
./gradlew apiSpecGenerate
!!!!!! GENERATE BEGIN !!!!!!
!!!!!! GENERATE END !!!!!!
!!!!!! CLEANUP BEGIN !!!!!!
FAILURE: Build failed with an exception.
* What went wrong:
Could not determine the dependencies of task ':apiSpecGenerate'.
> Could not create task ':cleanupGenerated'.
> /.../generated/api/ControllerApi.kt (No such file or directory)
型
但是如果我移除这个依赖项,apiSpecGenerate会产生结果。
它看起来像任务cleanupGenerated试图访问目录之前,它实际上是生成.如何告诉Gradle等待实际任务完成?
它在同一命令行调用中也不起作用:第二个任务什么也不做。它在实际代码生成开始之前完成:./gradlew apiSpecGenerate cleanupGenerated
./gradlew apiSpecGenerate cleanupGenerated
!!!!!! GENERATE BEGIN !!!!!!
!!!!!! GENERATE END !!!!!!
!!!!!! CLEANUP BEGIN !!!!!!
!!!!!! CLEANUP END !!!!!!
> Task :openApiGenerate
################################################################################
# Thanks for using OpenAPI Generator. #
# Please consider donation to help us maintain this project 🙏 #
# https://opencollective.com/openapi_generator/donate #
################################################################################
Successfully generated code to /projectdir/build/openapi-generated
型
只有当我通过不同的命令调用分离这些任务时,它才能工作:
./gradlew apiSpecGenerate
./gradlew cleanupGenerated
1条答案
按热度按时间bqucvtff1#
当你写:
字符串
大括号内的代码是 * 配置 * 任务,而不是指定任务运行时发生的 * 操作 *。
如果要运行该任务,则该代码将在项目配置阶段运行。但是,任务操作是在项目执行阶段运行的任务代码。自然,配置阶段发生在执行阶段之前,您不希望将它们混淆。
有不同的方法来指定任务操作,但最简单的是在配置块中使用
doLast
(参见文档):型
所以你的终结器任务需要看起来像这样:
型