gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:38:52 25 4
gpt4 key购买 nike

我正在从 0.12 移动 SBT 插件转至 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
}

)
)
}

为这个完全人为的例子道歉!

编辑

因此,考虑到马克的建议,我有以下更整洁的代码:
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")

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

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

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 := parTask.value
)
)
}

这似乎就在那里,但构建失败:
[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的区别是预期的返回类型是任务 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(",")
}

关于scala - 在 SBT 0.13 中习惯性地定义动态任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19224898/

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