scala – 在sbt中将输入任务与动态任务相结合
发布时间:2020-12-16 18:38:52 所属栏目:安全 来源:网络整理
导读:我想做一个输入任务,继续用户输入并生成一堆子任务来运行.这是一个例子: import sbt._import Keys._import Def.Initializeimport complete.DefaultParsers._object TestBuild extends Build { val sampleInput = inputKey[Seq[String]]("sample dynamic inp
我想做一个输入任务,继续用户输入并生成一堆子任务来运行.这是一个例子:
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.evaluated替换InputTask.value sources.map(sampleTaskFor _).joinWith(_.join) - }.value + }.evaluated ) 如果我能够定义正确的InputTask,它应该通过evaluate方法访问,因为我在尝试使用编译的不同InputTasks后在文档和实践中都找到了. 仍然不能解决sbt宏引擎拒绝提供inputTaskDyn的问题. 等待其他建议 解决方法
试错法给了我答案,但没有一点理解.这里是:
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",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) } } 出于某种原因,我无法理解您应该在单独的方法中隔离创建多任务单个任务的顺序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |