加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:00:52 所属栏目:安全 来源:网络整理
导读:我想要一个SBT任务,它将逗号分隔的测试类列表作为命令行的输入,由完全限定名称给出.现在我使用硬编码值运行任务但我想从命令行获取它.有人可以帮我写这样的任务吗? lazy val runTask = inputKey[Unit]("custom run") runTask := { val one = (runMain in Co
我想要一个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

提前致谢.

解决方法

你必须有一个 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,"))

?>运算符意味着它左侧的输入将被丢弃.解析器返回的值是完全限定类名的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为前缀)作为参数,并从InputTask返回一个Task obtained.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读