【问题标题】:How to write abstract and derived Gradle Groovy Tasks?如何编写抽象和派生的 Gradle Groovy 任务?
【发布时间】:2018-11-17 07:20:03
【问题描述】:

我有几个问题要如何编写可维护的 Groovy Gradle 任务:

  • 如何将任务标记为“抽象”,使任务无法从命令行运行,需要派生实现?

  • 如何派生任务?

  • 如何“封装”变量? (最好在(父)任务之外无法访问)。

例如在这个伪 gradle 脚本中,我希望只有 runnableTask 是可执行的,这导致运行 someTaskparam = "TEST"param2 = "SOMETHINGELSE"

这有什么可做的?

***abstract*** task someTask(type: com.bla.ATask) {
    param=someVar1
    param2=someVar2
}

***abstract*** task derivedTESTTask(***extends*** someTask) {
    someVar1="TEST"
}

task runnableTask(***extends**** derivedTESTTask) { 
    someVar2="SOMETHINGELSE"
}

【问题讨论】:

  • 您混淆了任务类型(类)和任务(实例)。您不能从另一个实例派生一个实例,您只能从另一个类派生一个类,然后创建该派生类的一个实例。

标签: gradle groovy build.gradle


【解决方案1】:

如果您需要使用参数创建完全抽象的任务,您可以创建类,从DefaultTask 扩展它并定义您的参数:

abstract class AdsTask extends DefaultTask {

  @Input
  def param1

  @Input
  def param2
}

然后你需要创建它的实现:

class ConcreteTask extends AdsTask {
  @TaskAction
  void anyNameMethod() {
    // your code
    println "Params $param1 $param2"
  }
}

然后为这些参数创建任务这个具体值:

task task1(type: ConcreteTask) {
  param1="TEST"
  param2="SOMETHINGELSE"
}

但你可以做得更简单:

class ConcreteTask extends DefaultTask {

  @Input
  def param1

  @Input
  def param2

  @TaskAction
  void anyNameMethod() {
    // your code
    println "Params $param1 $param2"
  }
}

task task1(type: ConcreteTask) {
  param1="TEST"
  param2="SOMETHINGELSE"
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多