在 sbt 中我们可以定义 settingKey, taskKey 和 inputKey. inputKey 接收输入的任务更具灵活性,虽然在 sbt 中 taskKey 和 inputKey 数量比例为 25:1,但仍然不可忽视了 inputKey 的贡献。
起初在阅读 sbt 关于 inputKey 的资料时,一不小心就被带入到 Parser 上去了。其实还不如开门见山,先跳过 Parser 部份,示范 inputKey 任务中直接处理用户的原生输入。
这里有两个最简单的 sbt inputKey 的示例
一. 命令后非空格起全部输入当作一个字符串
1 2 3 4 5 6 7 |
import complete.DefaultParsers._ val demo1 = inputKey[Unit]("Demo1 inputTask") demo1 := { val input = trimmed(any.* map(_.mkString)).parsed println(input) } |
trimmed() 方法能去除了两边的空格,如果是 token(any.* map(_.mkString)).parse 则两边空格都会算上,在 demo1 abc
的 abc 两边的空格也都会算在输入参数里
> demo1 abc "abc"
abc "abc"
sbt 的 input task 参数居然默认是紧接着命令开始的,如上面如果输入是 demo1xxx
, demo1 任务接收到的参数是 xxx
. 如果同时也定义了另一个任务是 demo1x
, 那么输入 demo1xx
就会执行 demo1x
任务,参数是 xx
. 从后往前进行匹配任务名。这个还有点奇怪,因为我以前任何时候都是自然的把命令与参数用空格分开,它却可以把命令与参数写在一起。
二. 像调用 main 方法一样传入参数