使用命令行中的参数运行SBT任务

时间:2014-05-30 10:37:44

标签: scala command-line sbt task scalatest

我想要一个SBT任务,它将由其完全限定名称给出的逗号分隔的测试类列表作为命令行的输入。现在我使用硬编码值运行任务但我想从命令行获取它。有人可以帮我写这样的任务。

 lazy val runTask = inputKey[Unit]("custom run")

 runTask := {
    val one = (runMain in Compile).fullInput(" org.scalatest.tools.Runner -P1 -C reporter.TestReporter -o -s testcase.GetAccountInfo -s testcase.GetProfileInfo").evaluated
 }

像这样,

 sbt runTask testcase.GetProfileInfo,testcase.GetAccountInfo

提前致谢。

1 个答案:

答案 0 :(得分:11)

你必须有Parser,它将解析给予任务的输入。获得输入后,您可以转换(runMain in Compile).toTask,并将输入提供给任务。

TL; DR; build.sbt

import sbt.complete._

import complete.DefaultParsers._

lazy val myRunTask = inputKey[Unit]("Runs actual tests")

lazy val FullQualifiedClassName = 
  (charClass(c => isScalaIDChar(c) || (c == '.'), "class name")).+.string

def commaDelimited(display: String) =
  token(Space) ~> repsep(token(FullQualifiedClassName, display), token(","))

lazy val testClassArgs: Parser[Seq[String]] = 
  commaDelimited("<full qualified test class name>").map { 
    xs: Seq[String] => xs.map(e => s" -s $e ")
  }

myRunTask := Def.inputTaskDyn {
  val classes = testClassArgs.parsed
  runMainInCompile(classes)
}.evaluated

def runMainInCompile(classes: Seq[String]) = Def.taskDyn {
  (runMain in Compile).toTask(s" org.scalatest.tools.Runner -P1 -C reporter.TestReporter -o ${classes.mkString}")
}

分析器

让我们从解析器开始。解析器必须占用一个空格,然后是用逗号分隔的类。

让我们首先定义一个解析器,解析完整的限定类名:

lazy val FullQualifiedClassName = 
      (charClass(c => isScalaIDChar(c) || (c == '.'), "class name")).+.string

一旦我们有了解析器,我们就可以将它与另一个解析器结合起来。我们需要创建一个解析器,它使用逗号分隔的完全限定类名:

def commaDelimited(display: String) = 
      token(Space) ~> repsep(token(FullQualifiedClassName, display), token(","))

~>运算符意味着它左侧的输入将被丢弃。解析器返回的值是完全限定类名的Seq[String]

从您的问题判断,您希望您的课程以-s为前缀。你可以稍后再做,但为了展示解析器的另一个功能,我将在这里做。

您可以使用map获取解析器的输出并将其转换为另一个输出。

lazy val testClassArgs: Parser[Seq[String]] = 
  commaDelimited("<full qualified test class name>").map { 
    xs: Seq[String] => xs.map(e => s" -s $e ")
  }

好的,我们几乎就在那里。

使用带有静态字符串

的参数运行InputTask

我们可以定义一个新的输入任务键。我会选择myRunTask,否则会与已存在的runTask发生冲突。

让我们定义一个方法,该方法将一系列类(已经以-s为前缀)作为参数,并从{{1}返回Task obtained }}

InputTask

现在让我们将一个任务中的所有元素组合在一起:

def runMainInCompile(classes: Seq[String]) = Def.taskDyn {
  (runMain in Compile).toTask(s" org.scalatest.tools.Runner -P1 -C reporter.TestReporter -o ${classes.mkString}")
}