SBT InputKey具有类似属性的参数

时间:2015-11-10 15:55:11

标签: scala sbt

有人可以帮我创建一个可以从命令行支持类似属性的参数的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的解决方案并在此更新。

2 个答案:

答案 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