【问题标题】:Skipping dependency execution of a disabled task in Gradle?在 Gradle 中跳过禁用任务的依赖执行?
【发布时间】:2013-04-19 08:30:19
【问题描述】:

当任务将被跳过时,是否有可能执行该任务的依赖项?

在下面的示例中,如果在执行runServerTests 时服务器已经在运行,我希望jar(以及jar 的依赖项)被执行。在这种情况下,服务器将由另一个进程启动。

apply plugin: 'java'

task startServerIfNotRunning(dependsOn: jar) {
  onlyIf { isServerNotRunning() }
  ...
}

task runServerTests(dependsOn: startServerIfNotRunning) { ... }

我不想在jar 任务中添加onlyIf,因为其他总是应该执行的任务可能取决于那个任务。 jar 任务也有自己的依赖关系。

【问题讨论】:

  • 我不知道这里的答案,但是如果您的服务器依赖于 jar,并且 jar 已过期,您为什么不想重新启动服务器呢?如果 jar 是最新的并且它的所有依赖项都是最新的,那么它不会花费你那么多时间,因为 jar 任务没有执行任何操作......
  • 虽然你说得有道理,但我们确实有很多子项目,所以即使一切都是最新的,完成一次完整的“重新编译”也需要大约 15-30 秒。如果可能的话,我想摆脱这段时间。大多数情况下,服务器都是最新的。

标签: dependencies gradle


【解决方案1】:

你可以这样做

task startServerIfNotRunning(dependsOn: jar) {
    if (isServerNotRunning()) {
        enabled = false;
        dependsOn = [];
    }
}

我们在配置阶段评估的 if 语句和相关任务被删除。我在Skipping Gradle Tasks 中用代码和输出对此进行了总结。看看吧。

【讨论】:

  • 这有一个缺点,那就是isServerNotRunning()每次都会在Gradle的配置阶段被调用,而不仅仅是在这个任务执行的时候。
  • 不,你的例子中的代码是在配置阶段执行的,在这个阶段所有的任务(在当前项目中)总是被配置。任务并不总是被执行,但这不是我要说的。我已经在 Gradle 2.2.1 中验证了这一点,这是撰写本文时的最新版本。
  • 你是对的,这是一个缺点。也用旧版本验证它。我收回我之前的评论。
【解决方案2】:

要获得所需的行为,您必须从任务执行图中排除任务,而不是跳过它的执行。您可以在命令行中使用-x 执行此操作,也可以使用gradle.startParameter.excludedTaskNames << "..."gradle.taskGraph.useFilter { task -> ... } 以编程方式执行此操作。

【讨论】:

  • 好的,谢谢。我猜这必须在配置阶段完成?
  • 是的。在执行阶段,任务执行图不能再改变。
  • @PeterNiederwieser 您能否更详细地解释或指出您提到的第二种方法的详细信息?我在相关文档中找不到“userFilter”gradle.org/docs/current/javadoc/index.html?org/gradle/api/…
  • org.gradle.execution.TaskGraphExecutor.useFilter
猜你喜欢
  • 2016-04-22
  • 2019-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2023-03-30
  • 1970-01-01
相关资源
最近更新 更多