有没有办法从gradle任务中读取命令行参数?

时间:2020-10-19 19:49:17

标签: gradle artifactory publish ivy

我正在寻找一种方法来禁用大多数子项目处理堆栈,如果我知道它已经构建并发布的话。我正在管理一个包含400个子项目的项目,并且可以通过检查是否确实需要构建子项目来节省时间。

我为此做的尝试,我在调用的任务中有一个块

task disablePublish{
  if (the resultant product is already published.)
  {
    project.tasks.all {
      task -> task.enabled = false
    }
  }
}
...
publish.dependsOn += [disablePublish]

当我将其称为publish时,这似乎很好用,如果rpm已发布,则它不会发布,然后构建它,如果尚未发布,则发布。

但是,如果不发布rpm的话,似乎会中断构建。

Skipping task 'mytask' as task onlyIf is false.

并且没有建立转速。

如果我注释掉

project.tasks.all {
  task -> task.enabled = false
}

构建效果很好。

所以我不确定其他人是否对此设计或想法有很好的解决方案。

谢谢您的时间和考虑。

1 个答案:

答案 0 :(得分:1)

我正在寻找一种方法来禁用大部分子项目处理堆栈,如果我知道它已经构建[并发布]。

看看增量构建。如果正确定义了任务的输入和输出,Gradle可以确定是否需要运行任务。这对于构建项目的任务应该没有问题。检查项目是否已经发布(因此不需要构建)可能很困难,因为很难定义任务输出。

是否真的需要构建子项目

这实际上表明您不应在任务级别上解决问题,而应在项目级别上解决问题。项目之间是否存在任何依赖关系,或者它们只是同一多项目构建的一部分,因为为所有项目运行单个命令很方便?看看多项目构建复合构建之间的区别。

我为此做的尝试,我在调用的任务中有一个块

这不是完全正确。有一个任务和一个代码块,但是它们没有以您认为的方式连接。实际上,如果代码看起来像这样,您的代码将以相同的方式工作:

if (the resultant product is already published.)
{
  project.tasks.all {
    task -> task.enabled = false
  }
}

task disablePublish {
}

为什么会这样?好了,创建任务时放在闭包中的任何代码都无法定义执行任务时发生的情况。而是直接运行代码以配置任务。执行任务时,仅(内部)任务操作doFirstdoLast关闭运行(因为在命令行中提到了该任务,或者由于dependsOn了):

println 'Before creating the task'

task myTask {
    println 'Task is configured'
    doLast {
        println 'Task is executed'
    }
}

println 'After creating the task'

只需将上面的代码放在build.gradle文件中,然后从同一目录运行gradle myTask。语句'Task is executed'将最后打印。现在,只需调用gradle,而无需在命令行上定义任何任务。 Gradle将在'Task is executed'旁边打印所有语句,表明在每次调用gradle时都配置了每个任务。

这表明,每次运行Gradle时,都会应用“任务”逻辑。任务disablePublish仍然为空,什么也不做。

当我将其称为publish时,这似乎很好用,如果rpm已发布,则它不会发布,然后构建它,如果尚未发布,则发布。

好吧,这取决于if块的条件,因为该条件基本上可以启用或禁用整个项目。当然,如果条件为false,则项目将完全正常工作;如果条件为true,则根本不会执行任何任务。

但是,如果不发布rpm的话,似乎会中断构建。

如果已发布(并且您的if条件对此进行了确认),则由于禁用了每个任务,您的整个项目将不会执行任何操作。由于无论执行任何任务都会应用此逻辑,因此这与publish任务无关。