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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |