如何将输入解析器与fullRunInputTask结合起来?

时间:2017-05-09 13:29:23

标签: scala sbt

在我的build.sbt中,我想要一个带有输入参数的任务,在我的代码中调用main方法,但我想在调用之前使用参数解析方法。

这是InputKey定义:

val clearDatabase = inputKey[Unit]("Clear database, arguments:  endpoint user password")

我想使用的解析器:

val databaseTaskParser = sbt.Def.spaceDelimited("endpoint username password").map(_.toList).map {
  case List(endpoint) => (endpoint, "", "")
  case List(endpoint, username, password) => (endpoint, username, password)
  case _ =>
    sys.error("Supported arguments: \"endpoint\" or \"endpoint username password\"")
}

然后我知道要将输入参数传递给main方法,我需要使用fullRunInputTask参数化上面定义的InputKey:

fullRunInputTask(clearDatabase, Compile, "my.code.ClearDatabaseTask")

现在,我如何将对fullRunInputTask的调用与使用databaseTaskParser(在给出错误的参数集时显示错误)甚至在 {{ 1}}方法被调用?

1 个答案:

答案 0 :(得分:1)

好的,我自己找到了一种方法。

最重要的是我需要使用 runTask 而不是 fullRunInputTask ,但我需要将其包装在动态输入任务中为了使用解析器。然后我需要evaluate来获取InputTask的{​​{1}}值。

所以实际的任务定义是:

inputKey

现在我还需要修改解析器以不返回元组而是返回列表或序列,但仍然要验证是否传递了正确数量的参数。我是这样做的:

clearDatabase := Def.inputTaskDyn {
  runTask(Compile, "my.code.ClearDatabaseTask", databaseTaskParser.parsed:_*)
}.evaluated

这就是诀窍:如果给出零或两个参数,val databaseTaskParser = sbt.Def.spaceDelimited("endpoint username password").map(_.toList).map { case args if List(1, 3).contains(args.length) => args.padTo(3, "") case _ => sys.error("Supported arguments: \"endpoint\" or \"endpoint username password\"") } 会失败并在sbt clearDatabase中运行main方法,如果给出一个或三个,则传递所有参数,不需要在该方法中进行额外验证。