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
使其运行