Gradle任务未正确排序

cdmah0mi  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(101)

我有两个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

bqucvtff

bqucvtff1#

当你写:

tasks.register("myTask") {
   // do some configuration
   // this code will run in the configuration phase if the task is to be run
}

字符串
大括号内的代码是 * 配置 * 任务,而不是指定任务运行时发生的 * 操作 *。
如果要运行该任务,则该代码将在项目配置阶段运行。但是,任务操作是在项目执行阶段运行的任务代码。自然,配置阶段发生在执行阶段之前,您不希望将它们混淆。
有不同的方法来指定任务操作,但最简单的是在配置块中使用doLast(参见文档):

tasks.register("myTask") {
   doLast {
      // specify code to run when myTask is run
      // this code will run in the project execution phase, if the task is run
   }
}


所以你的终结器任务需要看起来像这样:

val cleanupGeneratedFilesTask = tasks.register("cleanupGenerated") {
   doLast {   
      project.delete(
         files("$generatedDtosFolder/org.springframework.data.domain.Pageable.kt"),
         files("$generatedDtosFolder/org.springframework.data.domain.PageImpl.kt")
      )
   }
}

相关问题