【问题标题】:How to create gradle task which always runs?如何创建始终运行的 gradle 任务?
【发布时间】:2014-01-28 13:05:53
【问题描述】:

我可能忽略了一些非常核心/显而易见的事情,但是我如何创建一个始终为每个任务/目标执行的任务?

我可以这样做:

task someTask << {
    println "I sometimes run"
}
println "I always run"

但在任务中包含始终运行的部分会更理想。

我最接近的是:

task someTask << {
    println "I sometimes run"
}

println "I always run"

void helloThing() {
    println "I always run too. Hello?"
}

helloThing()

因此,使用方法是一个“好的”解决方案,但我希望有一种方法可以专门指定/重用任务。

希望有人有办法做到这一点。 :)

【问题讨论】:

  • 如果有N个任务,这个函数应该被调用N次吧?如果某些任务在给定的构建中从未执行过怎么办?
  • 或者你想为每个项目调用一个函数?
  • 每次构建一次。无论调用哪个任务。
  • 这是一个不寻常的要求,没有一流的功能。用例是什么?
  • 我想这个想法是一种更有组织的方法来处理常见的构建“任务”……但我可能只是在其中一些情况下使用方法。

标签: gradle build.gradle


【解决方案1】:

假设目标是打印系统信息,您可以总是在配置阶段打印信息(在任务声明之外),并且有一个不执行任何操作的虚拟任务systemStatus(因为无论如何都会打印信息) .或者,您可以将其实现为常规任务,并通过添加":systemStatus" 作为gradle.startParameter.taskNames(字符串列表)的第一项来确保任务始终运行,这模拟了某人总是键入gradle :systemStatus ...。或者您可以利用诸如gradle.projectsLoaded { ... } 之类的钩子在此处打印信息。

【讨论】:

  • 这是一个关于动态操作 taskNames 列表的很酷的技巧。 (作为参考,这有效:“gradle.startParameter.taskNames = [":someTask"] + gradle.startParameter.taskNames")
  • 知道如何将一个任务“挂钩”到另一个任务,而不是不鼓励使用“执行”?
  • dependsOn 或 finalizedBy.
【解决方案2】:

这将为给定构建中每个项目中的每个任务附加一个闭包:

def someClosure = { task ->
  println "task executed: $task"
}

allprojects {
  afterEvaluate {
    for(def task in it.tasks)
      task << someClosure
  }
}

如果您需要每次构建只调用一次函数/闭包,在所有项目的所有任务之前,请使用:

task('MyTask') << {
  println 'Pre-build hook!'
}

allprojects {
  afterEvaluate {
    for(def task in it.tasks)
      if(task != rootProject.tasks.MyTask)
        task.dependsOn rootProject.tasks.MyTask
  }
}

如果您需要每次构建只调用一次函数/闭包,在所有项目的所有任务之后,使用这个:

task('MyTask') << {
  println 'Post-build hook!'
}

allprojects {
  afterEvaluate {
    for(def task in it.tasks)
      if(task != rootProject.tasks.MyTask)
        task.finalizedBy rootProject.tasks.MyTask
  }
}

【讨论】:

  • 嗯...这很方便...比我希望的要详细一点,但仍然很容易。
  • 我更新了我的答案,关心你所说的 - “每次构建一次”。
  • 使用 per-build hook 比 per-project hook 更好。第二个 sn-p 将在构建结束时运行任务,而不是开始。
  • 我选择了彼得的答案,因为它更简洁一些。也就是说,我也可能会使用其他方法。 (但我只能选择一个答案;))。谢谢您的帮助。 :)
  • 好点,彼得,谢谢。我用两种变体扩展了答案:预构建和构建后挂钩。
【解决方案3】:

直接从根 build.gradle 调用它有什么问题?

task init << {
    println "I always run"
}

tasks.init.execute()

【讨论】:

  • execute() 现在已弃用,将在 Gradle 5.0 中删除
猜你喜欢
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
  • 2022-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
相关资源
最近更新 更多