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

Is there a way to read command line parameters from within a gradle task?

我正在寻找一种方法来禁用我的大部分子项目处理堆栈(如果我知道它已经构建并发布)。我正在管理一个包含 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.

并且没有构建 rpm。

如果我注释掉

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

构建效果很好。

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

感谢您的时间和考虑。

I'm looking for a way to disable most of my sub project processing stack if I know it's already built [and published].

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

if I really need to build a sub project or not

这实际上表明你不应该在任务层面解决你的问题,而应该在项目层面解决。项目之间是否存在任何依赖关系,或者它们是否只是同一 multi-project 构建的一部分,因为 运行 所有项目的单个命令很方便?看看 multi-project buildscomposite builds.

之间的区别

My attempt to do this end I have a block inside a task that calls

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

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 为 运行 时都会应用您的 'task' 逻辑。然而,任务 disablePublish 仍然是空的,什么也不做。

When I call publish, this seems to work great, if the rpm is already published, it doesn't publish, and builds it and publishes if it's not.

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

However it seems to break building if I don't call publish, if the rpm is published.

如果发布(并且您的 if 条件证实了这一点),您的整个项目将不会执行任何操作,因为每个任务都被禁用。由于无论任何任务都会应用此逻辑,因此这与 publish 任务无关。