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

Sar*_*ath 9 command-line scala task sbt 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
 }
Run Code Online (Sandbox Code Playgroud)

像这样的东西,

 sbt runTask testcase.GetProfileInfo,testcase.GetAccountInfo
Run Code Online (Sandbox Code Playgroud)

提前致谢.

lpi*_*ora 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}")
}
Run Code Online (Sandbox Code Playgroud)

分析器

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

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

lazy val FullQualifiedClassName = 
      (charClass(c => isScalaIDChar(c) || (c == '.'), "class name")).+.string
Run Code Online (Sandbox Code Playgroud)

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

def commaDelimited(display: String) = 
      token(Space) ~> repsep(token(FullQualifiedClassName, display), token(","))
Run Code Online (Sandbox Code Playgroud)

~>操作者意味着在它的左侧,输入将被丢弃.解析器返回的值是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 ")
  }
Run Code Online (Sandbox Code Playgroud)

好的,我们快到了.

使用带有静态字符串的参数运行InputTask

我们可以定义一个新的输入任务键.我会选择myRunTask,因为否则它会与runTask已经存在的碰撞.

让我们定义一个方法,它接受一系列类(已经加前缀-s)作为参数,并返回从a Task 获得InputTask.

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

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

myRunTask := Def.inputTaskDyn {
  val classes = testClassArgs.parsed
  runMainInCompile(classes)
}.evaluated
Run Code Online (Sandbox Code Playgroud)