Scala 从命令行运行带参数的SBT任务

Scala 从命令行运行带参数的SBT任务,scala,command-line,sbt,task,scalatest,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

我想有一个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
提前感谢。

您必须有一个,它将解析给定给任务的输入。一旦有了输入,就可以转换输入,并将其提供给任务

TL;博士<代码>build.sbt 一旦我们有了解析器,我们就可以将它与另一个解析器组合在一起。我们需要创建一个解析器,它采用逗号分隔的完整限定类名:

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 ")
  }
现在,让我们将所有元素合并到一个任务中:

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

嗨,伊皮皮奥拉,谢谢你的回答。我收到以下导入错误\build.sbt:52:错误:找不到值charClass(charClass(c=>isScalaIDChar(c)| |(c='.',“类名”)).+.string^D:\Workspaces\KeplerWS_2\cross browser test\build.sbt:57:错误:找不到类型解析器lazy val testClassArgs:Parser[Seq[string]=\build.sbt:55:错误:找不到值令牌(空格)~>repsep(令牌)(FullQualifiedClassName,显示),标记(“,”)sbt.compiler.EvalException:表达式中键入错误我遗漏了什么?我是sbt新手。请指导我。@Sarath您是在sbt 0.13.5上运行它的吗?您是否尝试过创建一个
build.sbt
文件,仅使用第一个代码段中的内容Hi lpiepiora,我使用的是sbt 0.13。我创建了一个build.sbt文件,其中的内容与您创建的内容相同osted。遇到一些导入问题。你能试用sbt 0.13.5吗?还要记住新行很重要,不要连接行,它们在我的代码段中没有连接。
lazy val testClassArgs: Parser[Seq[String]] = 
  commaDelimited("<full qualified test class name>").map { 
    xs: Seq[String] => xs.map(e => s" -s $e ")
  }
def runMainInCompile(classes: Seq[String]) = Def.taskDyn {
  (runMain in Compile).toTask(s" org.scalatest.tools.Runner -P1 -C reporter.TestReporter -o ${classes.mkString}")
} 
myRunTask := Def.inputTaskDyn {
  val classes = testClassArgs.parsed
  runMainInCompile(classes)
}.evaluated