Scala 评估sbt任务内的任务列表
我想评估单个任务中的任务列表 这是我的代码:Scala 评估sbt任务内的任务列表,scala,sbt,Scala,Sbt,我想评估单个任务中的任务列表 这是我的代码: val testPar: sbt.TaskKey[scala.Unit] = TaskKey("test-par") testPar := { (Test / definedTests) .value .map(td => " " + td.name) .map(t => (Test / testOnly).toTask(t)) .map(_.value) } 但我得到了一个错误: 错误:非法动态引
val testPar: sbt.TaskKey[scala.Unit] = TaskKey("test-par")
testPar := {
(Test / definedTests)
.value
.map(td => " " + td.name)
.map(t => (Test / testOnly).toTask(t))
.map(_.value)
}
但我得到了一个错误:
错误:非法动态引用:x$1.map(u.value) 我尝试按照此处的建议使用
Def.taskDyn
,但出现以下错误:
错误:类型不匹配找到:所需序列[单元]:
sbt.Def.Initialize[sbt.Task[?]] 我正在使用sbt
1.3.9
我在这里遗漏了什么?您已经将tasPar定义为TaskKey[Unit],然后您正在从testOnly调用任务(t):
val testPar: sbt.TaskKey[scala.Unit] = TaskKey("test-par")
testPar := {
(Test / definedTests).value
.map(td => " " + td.name)
.map(t => (Test / testOnly).toTask(t))
}
而testOnly
的类型是sbt.InputKey[scala.Unit]
。
其中文件说明:
初始化[InputTask[T]]时的toTask方法接受要应用的字符串输入,并生成可以正常使用的任务
因此,在您的情况下,
T
是Unit
,您无法使用map
进一步链接输入任务您正面临一个我过去也经常遇到的问题。
在大多数情况下,taskDyn和递归的组合起到了解救作用:
val testPar: sbt.TaskKey[scala.Unit] = TaskKey("test-par")
testPar := Def.taskDyn {
val tasks = (Test / definedTests).value
.map(td => " " + td.name)
.map(t => (Test / testOnly).toTask(t))
flattenTasks(tasks)
}.value
def flattenTasks[A](tasks: Seq[Def.Initialize[Task[A]]]): Def.Initialize[Task[List[A]]] =
tasks.toList match {
case Nil => Def.task { Nil }
case x :: xs => Def.taskDyn { flattenTasks(xs) map (x.value :: _) }
}
但是,如果我手动指定所有测试(即:
(test/testOnly).toTask(“Test1”).value;(test/testOnly).toTask(“Test2”).value;…
),它工作正常。那么,如何使它与列表一起工作呢?toTask
生成一个任务,因此我必须调用.value
使其运行