【问题标题】:Is there a way to read command line parameters from within a gradle task?有没有办法从 gradle 任务中读取命令行参数?
【发布时间】:2021-02-02 15:18:33
【问题描述】:

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

我试图做到这一点,我在一个调用的任务中有一个块

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

当我调用发布时,这似乎工作得很好,如果 rpm 已经发布,它不会发布,如果没有,则构建它并发布。

但是,如果我不调用发布,如果 rpm 已发布,它似乎会破坏构建。

Skipping task 'mytask' as task onlyIf is false.

并且没有构建任何 rpm。

如果我注释掉

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

构建效果很好。

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

感谢您的时间和考虑。

【问题讨论】:

    标签: gradle artifactory publish ivy


    【解决方案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 仍然是空的,什么也不做。

    当我调用发布时,这似乎工作得很好,如果 rpm 已经发布,它不会发布,如果没有,则构建它并发布。

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

    但是,如果我不调用发布,如果 rpm 已发布,它似乎会破坏构建。

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

    【讨论】:

    • 感谢您详细而多方面的回答,这与我所看到的一致。我认为解决方案是将我的条件变成一个 isPublished 任务,它可以输出一个布尔值。这应该很好用。我喜欢你在复合构建上的 cmets。我正在考虑编写一个自定义 gradle 包装器来隐藏大部分父项目脚本,这看起来也可以提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-07-04
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 2022-08-16
    相关资源
    最近更新 更多