gpt4 book ai didi

scala - 使用命令行参数运行 SBT 任务

转载 作者:行者123 更新时间:2023-12-01 16:46:48 27 4
gpt4 key购买 nike

我想要一个 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, 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 为前缀)作为参数,并返回一个 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}")
}

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

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

关于scala - 使用命令行参数运行 SBT 任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23952566/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com