在sbt中将输入任务与动态任务相结合

时间:2014-05-29 09:20:06

标签: scala sbt

我想做一个输入任务,继续用户输入并生成一堆子任务来运行。这是一个例子:

import sbt._
import Keys._
import Def.Initialize
import complete.DefaultParsers._

object TestBuild extends Build {
  val sampleInput = inputKey[Seq[String]]("sample dynamic input task")
  val sampleDynamic = taskKey[Seq[String]]("sample dynamic task")

  override lazy val settings = super.settings ++ Seq(
    sampleDynamic := Def.taskDyn {
      val sources = Seq("ab", "csd", "efda")
      sources.map(sampleTaskFor _).joinWith(_.join)
    }.value,
    sampleInput := Def.inputTaskDyn {
      val sources = spaceDelimited("<arg>").parsed
      sources.map(sampleTaskFor _).joinWith(_.join)
    }.value
  )

  private def sampleTaskFor(source : String) : Initialize[Task[String]] = Def.task {
    source + " : " + source
  }
}

有两个样本。第一个工作并显示带有预定义输入的简单taskDyn。第二个是用户输入的动态任务,拒绝编译我无法解释的错误

[error] home/project/build.scala:15: Illegal dynamic reference: Def
[error]     sampleInput := Def.inputTaskDyn {
[error]                                     ^
[error] one error found
[error] (compile:compile) Compilation failed

我该如何避免呢?


试验和错误日志

在那里,我会将我的问题附加到仍然无法解决问题的不同提议的更改

将InputTask.value替换为InputTask.evaluated

      sources.map(sampleTaskFor _).joinWith(_.join)
-   }.value
+   }.evaluated
  )

如果我能够定义正确的InputTask,则应该通过evaluated方法访问它,因为我在尝试使用编译的不同InputTasks后在文档和实践中都找到了。

仍然无法解决sbt宏引擎拒绝提供inputTaskDyn的问题。


等待其他建议

1 个答案:

答案 0 :(得分:5)

试错法给了我答案,但没有一点理解。这是:

import sbt._
import Keys._
import Def.Initialize
import complete.DefaultParsers._

object TestBuild extends Build {
  val sampleInput = inputKey[Seq[String]]("sample dynamic input task")
  val sampleDynamic = taskKey[Seq[String]]("sample dynamic task")

  override lazy val settings = super.settings ++ Seq(
    sampleDynamic := Def.taskDyn {
      val sources = Seq("ab", "csd", "efda")
      sources.map(sampleTaskFor _).joinWith(_.join)
    }.value,
    sampleInput := Def.inputTaskDyn {
      val sources = spaceDelimited("<arg>").parsed
      sampleTaskAll(sources)
    }.evaluated
  )

  private def sampleTaskFor(source : String) : Initialize[Task[String]] = Def.task {
    source + " : " + source
  }

  private def sampleTaskAll(sources : Seq[String]) : Initialize[Task[Seq[String]]] = Def.taskDyn {
    sources.map(sampleTaskFor _).joinWith(_.join)
  }
}

由于某种原因,我无法理解你应该在一个单独的方法中隔离创建单任务序列的多任务。