在我的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方法,我需要使用与上面定义的InputKey参数化的fullRunInputTask:
fullRunInputTask(clearDatabase, Compile, "my.code.ClearDatabaseTask")
现在,即使在调用main方法之前,如何将对fullRunInputTask的调用与使用databaseTaskParser(在给出错误的参数集时显示错误)相结合?
最佳答案 好的,我自己也找到了一种方法.
这里最重要的是我需要使用runTask而不是fullRunInputTask,但是我需要将它包装在动态输入任务中才能使用解析器.然后我需要对它进行评估以获取inputKey的InputTask值.
所以实际的任务定义是:
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就会失败并在my.code.ClearDatabaseTask中运行main方法,如果给出一个或三个,则传递所有参数,而不需要在该方法中进行额外的验证.