Scala 在SBT 0.13中习惯性地定义动态任务?

Scala 在SBT 0.13中习惯性地定义动态任务?,scala,sbt,Scala,Sbt,我正在将SBT插件从0.12移动到0.13。在我的插件的不同点上,我在SBT构建图上安排了一组动态任务 下面是我的旧代码。这仍然是表达这一点的惯用方式,还是可以利用宏使一切变得更漂亮 import sbt._ import Keys._ object Toplevel extends Build { lazy val ordinals = taskKey[Seq[String]]("A list of things") lazy val times = taskKey[Int]

我正在将SBT插件从
0.12
移动到
0.13
。在我的插件的不同点上,我在SBT构建图上安排了一组动态任务

下面是我的旧代码。这仍然是表达这一点的惯用方式,还是可以利用宏使一切变得更漂亮

import sbt._
import Keys._

object Toplevel extends Build
{
    lazy val ordinals = taskKey[Seq[String]]("A list of things")
    lazy val times = taskKey[Int]("Number of times to list things")
    lazy val inParallel = taskKey[Seq[String]]("Strings to log in parallel")

    lazy val Foo = Project( id="Foo", base=file("foo"),
        settings = Defaults.defaultSettings ++ Seq(
            scalaVersion    := "2.10.2",

            ordinals := Seq( "First", "Second", "Third", "Four", "Five" ),

            times := 3,

            inParallel <<= (times, ordinals, streams) flatMap
            { case (t, os, s) =>
                os.map( o => toTask( () =>
                {
                    (0 until t).map( _ => o ).mkString(",")
                } ) ).join
            }

        )
    )
}
这似乎很接近,但构建失败,原因是:

[error] /home/alex.wilson/tmp/sbt0.13/project/build.scala:13: type mismatch;
[error]  found   : sbt.Def.Initialize[Seq[sbt.Task[String]]]
[error]  required: sbt.Def.Initialize[sbt.Task[?]]
[error]         ordinals.value.map(o => ordinalTask(o, t)).join

您可以使用
Def.taskDyn
,它为
flatMap
提供了新的语法。与
Def.task
的区别在于,预期的返回类型是task
Initialize[task[T]
而不是
T
。翻译你的例子

inParallel := parTask.value

def parTask = Def.taskDyn {
   val t = times.value
   ordinals.value.map(o => ordinalTask(o, t)).joinWith(_.join)
}

def ordinalTask(o: String, t: Int) = Def.task {
   (0 until t).map(_ => o).mkString(",")
}

你好,马克。我猜你是说taskDyn,不是dynTask?我在编译示例时仍然遇到问题,类型不匹配:
[error]发现:sbt.Def.Initialize[Seq[sbt.Task[String]][error]必需:sbt.Def.Initialize[sbt.Task[?][error]ordinals.value.map(o=>ordinalTask(o,t)).join
已更新。不幸的是,
.join
未正确解析。我已经为这个打开了。谢谢马克。我现在就用这个,然后再往下看。
inParallel := parTask.value

def parTask = Def.taskDyn {
   val t = times.value
   ordinals.value.map(o => ordinalTask(o, t)).joinWith(_.join)
}

def ordinalTask(o: String, t: Int) = Def.task {
   (0 until t).map(_ => o).mkString(",")
}