gpt4 book ai didi

gradle - DRY Gradle 任务

转载 作者:行者123 更新时间:2023-12-03 03:08:55 25 4
gpt4 key购买 nike

是否有任何简洁、直接的方法可以在 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 提示找不到方法“sbtTask()”。

谁能建议一种方法来做到这一点?

最佳答案

如果您将任务作为参数添加到 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'

关于gradle - DRY Gradle 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36369616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com