如何动态调用SBT InputTask?

时间:2015-08-21 13:49:53

标签: scala dynamic sbt

我想创建一个新的自定义InputTasktestOnlyCustom

  • 使用与testOnly
  • 相同的参数调用testOnlyCustom
  • 也许,根据SBT设置(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引用pretest(因此没有参数)来实现解决方案,但我无法解决{{{1}的问题1}},使用testOnlyCustom

这是我的代码:

InputTask
  1. 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上的文档很少见。
  2. 是否可以通过inputTaskDyn强制执行“顺序”执行,就像我一样?我已经看到SBT 0.13.8包含dependsOn。但这似乎不适用于InputTasks?
  3. 如何将Def.sequantial转换为InputTask(与taskDyn / inputTaskDyn一起使用)但仍然坚持Task使用显式解析器?或者有没有办法重用evaluated解析器?
  4. 有人可以对testOnly的{​​{1}}和.evaluated进行更多说明。 .parsed究竟做了什么?
  5. 如果有人能提供有效的解决方案,那就太好了!

    非常感谢提前

    马丁

3 个答案:

答案 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