我想创建一个新的自定义InputTask
(testOnlyCustom
)
testOnly
和testOnlyCustom
condition
),在调用testOnly之前调用另一个任务(让我们称之为pre
)。在这里,我必须强制“顺序”执行。因此:
If condition is true
testOnlyCustom com.dummy.TestSuite calls
pre and then
testOnly com.dummy.TestSuite
If condition is false
testOnlyCustom com.dummy.TestSuite calls
testOnly com.dummy.TestSuite
虽然我能够使testCustom
引用pre
和test
(因此没有参数)来实现解决方案,但我无法解决{{{1}的问题1}},使用testOnlyCustom
这是我的代码:
InputTask
import sbt._
import sbt.Keys._
import sbt.Def._
import sbtsequential.Plugin._
object Simple extends sbt.Plugin {
import SimpleKeys._
object SimpleKeys {
lazy val condition = SettingKey[Boolean]("mode", "The mode.")
lazy val pre = TaskKey[Unit]("test-with-pre", "Do some pre step.")
lazy val testWithPre = TaskKey[Unit]("test-with-pre", "Run pre task beforehand")
lazy val testCustom = TaskKey[Unit]("test-custom", "Run pre (depending on condition) and then test.")
lazy val testOnlyWithPre = InputKey[Unit]("test-only-with-pre", "Run selected tests (like test-only in SBT) with pre executed before.")
lazy val testOnlyCustom = InputKey[Unit]("test-only-configured", "Run pre (depending on condition) and then call test-only.")
}
lazy val baseSettings: Seq[sbt.Def.Setting[_]] = Seq(
// this is working
testWithPre := test.value,
testWithPre <<= testWithPre.dependsOn( pre ),
testCustom := Def.taskDyn {
val c = condition.value
if (c) {
testWithPre
} else {
test
}
}.value,
//
// this is the part, where my question focuses on
//
testOnlyWithPre := testOnly.evaluated,
testOnlyWithPre <<= testOnlyWithPre.dependsOn( pre ),
// is this the correct approach?
testOnlyCustom := Def.inputTaskDyn {
// ???????????????????????????????
Def.task()
}.evaluated
)
lazy val testSimpleSettings: Seq[sbt.Def.Setting[_]] = baseSettings
}
还有什么路要走?究竟是什么?我刚刚选择了它,因为它似乎是inputTaskDyn
的动态版本。不幸的是,InputTasks
上的文档很少见。inputTaskDyn
强制执行“顺序”执行,就像我一样?我已经看到SBT 0.13.8包含dependsOn
。但这似乎不适用于InputTasks?Def.sequantial
转换为InputTask
(与taskDyn / inputTaskDyn一起使用)但仍然坚持Task
使用显式解析器?或者有没有办法重用evaluated
解析器?testOnly
的{{1}}和.evaluated
进行更多说明。 .parsed
究竟做了什么?如果有人能提供有效的解决方案,那就太好了!
非常感谢提前
马丁
答案 0 :(得分:0)
我能想出的最佳解决方案是
testOnlyCustom := Def.inputTaskDyn {
val args: Seq[String] = spaceDelimited("").parsed
val c = condition.value
if (c) {
testOnlyWithPre.toTask(" " + args.head)
} else {
testOnly.toTask(" " + args.head)
}
}.evaluated
但是,这仍然迫使我使用新的解析器(spaceDelimited
)而我无法(重新)使用testOnly解析器。
如何重用解析器?
答案 1 :(得分:0)
首先,OlegYch_在Freenode#sbt上表示提出了SBT 0.13.9,Inputtask
s的执行将可以通过
def runInputTask[T](key: InputKey[T], input: String, state: State): (State, T)
sbt.Extracted.scala
中的。
第二,testOnly解析器可以通过sbt.Defaults#inputTests
重复使用。
答案 2 :(得分:0)
就记录而言,SBT 1等效项是
testOnlyWithPre := test.dependsOn(pre).value
和
testOnlyWithPre := testOnly.dependsOn(pre).evaluated