DRY Gradle任务

时间:2016-04-02 05:36:37

标签: gradle groovy

是否有任何整洁,直接的方法来抽象出gradle中的任务元素?

我正在创建一个混合项目,其中包括一些要编译为Javascript的Scala - 单独使用Gradle似乎无法实现。但是我最终得到了几个看起来像这样的任务:

task buildScalaJS(type: Exec) {
    workingDir './scalajs'
    commandLine '../sbt', 'fastOptJS'
}

task buildScalaJSLauncher(type: Exec, dependsOn: buildScalaJS) {
    workingDir './scalajs'
    commandLine '../sbt', 'scalaJSLauncher'
}

我的第一个想法是将其抽象为如下函数:

def sbt(String... params) {
    workingDir './scalajs'
    commandLine('../sbt', params)
}

但是,这些属性并不存在于任务定义的范围之外,因此这(可以理解)会导致错误。

我能想到的另一种方法是拥有一个生成任务的功能:

def sbtTask(String taskName, String sbtTask = taskName, Map options) {
    Map defaultOptions = [type: Exec]
    task ("${taskName}", (defaultOptions << options)) {
        workingDir './scalajs'
        commandLine '../sbt', sbtTask
    }
}

sbtTask('buildScalaJS', 'fastOptJS')
sbtTask('buildScalaJSLauncher', 'scalaJSLauncher', dependsOn: 'buildScalaJS')

然而,gradle抱怨方法&#39; sttTask()&#39;无法找到。

有人可以建议这样做吗?

1 个答案:

答案 0 :(得分:3)

如果您将任务作为参数添加到sbt()

,那么您的第一个选项应该有效
def sbt(task, String ... params) {
    task.workingDir './scalajs'
    task.commandLine('../sbt', params)
}

task buildScalaJS(type: Exec) {
    sbt delegate, 'fastOptJS'
}

task buildScalaJSLauncher(type: Exec, dependsOn: buildScalaJS) {
    sbt delegate, 'scalaJSLauncher'
}

编辑:我现在看到你可能会遇到commandLine方法的问题,因为参数将作为(String,String [])传递。您需要将它们组合到一个列表或数组中,如下所示:task.commandLine(['../sbt'] + (params as List))

您的第二个选项也应该有效,但您的功能定义和任务定义中存在问题。尝试将其更改为以下内容:

def sbtTask(Map options = [:], String taskName, String sbtTask) {
    Map defaultOptions = [type: Exec]
    task(defaultOptions + options, taskName) {
        workingDir './scalajs'
        commandLine '../sbt', sbtTask
    }
}

sbtTask 'buildScalaJS', 'fastOptJS'
sbtTask 'buildScalaJSLauncher', 'scalaJSLauncher', dependsOn: 'buildScalaJS'