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

ayv*_*ngo 6 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
  }
}
Run Code Online (Sandbox Code Playgroud)

有两个样本.第一个工作并显示带有预定义输入的简单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
Run Code Online (Sandbox Code Playgroud)

我怎么能避免呢?


试用和错误日志

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

用InputTask.evaluated替换InputTask.value

      sources.map(sampleTaskFor _).joinWith(_.join)
-   }.value
+   }.evaluated
  )
Run Code Online (Sandbox Code Playgroud)

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

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


等待其他建议

ayv*_*ngo 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)
  }
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我无法理解您应该在单独的方法中按照单个任务的顺序来隔离创建多任务。

  • 这个问题是针对0.13.1版本的,它的零文档编写插件。文档仅包含基本用法。sbt建议开箱即用的某些功能对于插件创建者而言是不可行的。因此,我下载了源代码并试图理解它。有些进展顺利,有些对我来说太难了。我写了插件,并且不升级为较新版本,因为我觉得没有能力再次阅读代码。而且我希望新版本也没有有效的文档。 (2认同)
  • 我放弃了 sbt,直到它为插件编写者提供详尽的文档。花在分析源代码上的时间不值得一些小的自动化改进 (2认同)