假设我有以下任务启动和停止:
val doStart = inputKey[Unit]("Starts something.")
val doStop = taskKey[Unit]("Stops something.")
这里doStart
输入任务接受一些控制事物启动方式的参数。
现在我想编写一个doRestart
行为,其行为与doStart
相同,但首先调用doStop
。这意味着我希望doRestart
接受与doStart
相同的参数,如果doStart
失败,我也不希望doStop
运行。
我能想出的最好的是以下定义:
val doRestart = inputKey[Unit]("Stops and starts something.")
doRestart := Def.inputTaskDyn {
val args = Def.spaceDelimited().parsed
doStop.value
Def.inputTask {
doStart.evaluated
}.toTask(" " + args.mkString(" "))
}.evaluated
但是,我完全不喜欢我必须通过手动传递参数,特别是因为我看不到任何方法来避免用空格分割输入(我无法找到一个刚刚通过的解析器输入为单个字符串)。此外,inputTaskDyn
要求其参数返回Initialize[Task[T]]
而不是Initialize[InputTask[T]]
,因此我无法在调用时返回Def.inputTask
和parsed
的结果Initialize[InputTask[T]]
,返回Task[T]
,而不是Initialize[Task[T]]
,因此我也无法使用parsed
。
有更好的方法吗?