有人可以帮我创建一个可以从命令行支持类似属性的参数的SBT任务吗?
lazy val myTask = inputKey[Unit]("my task")
myTask := {
if (directoryOpt.isEmpty) // directoryOpt comes from an optional command line argument: directory="~/downloads"
fullRunInputTask(inputKey, Compile, "example.MyTaskClass")
else
fullRunInputTask(inputKey, Compile, "example.MyTaskClass", directoryOpt.get)
}
任务可以从命令行运行,如:
sbt myTask directory="~/downloads"
我确实在http://www.scala-sbt.org/0.13/docs/Input-Tasks.html阅读了sbt doc。但它只解释了如何创建像sbt myTask option1 option2
这样的任务解析器并不能满足我的需求。
更新: 我使用了jazmit的解决方案,因为这是一个简单的改变。它运作良好!我也将尝试Mariusz的解决方案并在此更新。
答案 0 :(得分:2)
您可以在project/Build.scala
的{{1}}输入中使用build.sbt
。您也可以使用Commands
代替任务。下面是一个例子:
import sbt._
import Keys._
object CustomBuild extends Build {
def myTask = Command.args("myTask", "<name>"){ (state, args) =>
val argMap = args.map { s =>
s.split("=").toList match {
case n :: v :: Nil => n -> v
}
}.toMap
//println(argMap) //to see all argument pairs
//react on name in params list
println("Hi "+ argMap.getOrElse("name", "Unknown"))
state //Command can modify state, so you must to return it.
}
}
现在您必须在build.sbt add
中将此命令添加到您的项目中commands += myTask
现在你可以使用它了:
> sbt "myTask name=Mario"
> Hi Mario
> sbt myTask
> sbt Hi Unknown
希望,它会帮助你! 更多关于命令: you can find here
答案 1 :(得分:1)
您可以使用环境属性快速实现您想要的目标。
从命令行设置属性,如下所示:
sbt myTask -Ddirectory="~/downloads"
从任务中,您可以按如下方式检索值:
val directory = System.getProperty("directory");
如果您想通过语法检查,制表符完成等方式做一些更加扎实的事情,您可以将输入任务定义为详细的here。如果您需要property = value语法,可以使用parser combinator library来定义它,例如:
import sbt.complete.DefaultParsers._
val myArgs: Parser[String] = "directory=" ~> StringEscapable