代码之家  ›  专栏  ›  技术社区  ›  lev

评估sbt任务内部的任务列表

  •  0
  • lev  · 技术社区  · 6 年前

    这是我的代码:

    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)
    }
    

    但我有个错误:


    我试着用 Def.taskDyn 正如这里所建议的 https://stackoverflow.com/a/56096741/245024

    错误:类型不匹配;
    发现:需要序列[单位]:

    我在用sbt 1.3.9

    0 回复  |  直到 6 年前
        1
  •  1
  •   Aki    6 年前

    在大多数情况下,将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 :: _) }
      }
    
        2
  •  1
  •   Bob    6 年前

    您已将tasPar定义为TaskKey[单元],然后您将调用 toTask(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] . 文件上说:

    初始化[input task[T]]时的toTask方法接受要应用的字符串输入,并生成一个可以正常使用的任务。

    所以,对你来说 T Unit 你不能再和 map