Gradle 插件任务排序

Gradle plugin task ordering

我有什么?

  1. Java 带有 Main class (MainApp)
  2. 的源文件
  3. gradle 构建脚本

    应用插件:'application' mainClassName = "MainApp" sourceSets.main.java.srcDirs = ['.']

因此,当我执行 gradle run 时,它会执行主要方法并且一切正常。

C:\tmp\gradle-fun>gradle 运行
:编译Java
:processResources 最新
:classes
:运行
你好主应用程序!
构建成功

我想做什么?

现在我想知道在 run 任务执行之前清理构建目录的清理任务(常见构建任务)。

这背后是有原因的,我想确保每次 gradle 都应该编译 java 文件并且所有 .class 文件都应该刷新(它的一些要求)

我试过什么?

添加了一个包装器任务,它按顺序执行清理任务和 运行 任务。

apply plugin: 'application'
mainClassName = "MainApp"
sourceSets.main.java.srcDirs = ['.'] 
task exec(dependsOn: ['clean', 'run'])

所以当我 运行 gradle exec 时,它会正常工作。但是我觉得当你有额外的任务只是为了命令执行时它的补丁工作。

C:\tmp\gradle-fun>gradle 运行
:干净的
:编译Java
:processResources 最新
:classes
:运行
你好主应用程序!
:执行
构建成功

我想知道什么?

有什么方法可以避免编写包装器任务并做一些 Gradle 魔术来达到要求吗?

run 任务依赖于 clean。这将确保您的项目在每个 运行 之前得到清理。如果您想更具体地说明您的用例,您可以简单地清除 compileJava 任务。

run.dependsOn 'cleanCompileJava'

编辑: 为避免在 运行 之前删除您的 类 添加:

classes.mustRunAfter 'cleanCompileJava'

您可以创建自己的任务,将 cleanrun 作为依赖项:

task cleanRun(dependsOn: [clean, run])

或者,您可以按照 Mark Vieira 的回答更改线路:

run.dependsOn 'clean'
classes.mustRunAfter 'clean'

第二行确保它不会清除已编译的 类。

希望这对您有所帮助 =)