是否有任何整洁,直接的方法来抽象出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;无法找到。
有人可以建议这样做吗?
答案 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'