sbt 最简单的带输入任务 inputTask

在 sbt 中我们可以定义 settingKey, taskKey 和 inputKey. inputKey 接收输入的任务更具灵活性,虽然在 sbt 中 taskKey 和  inputKey 数量比例为 25:1,但仍然不可忽视了 inputKey 的贡献。

起初在阅读 sbt 关于 inputKey 的资料时,一不小心就被带入到 Parser 上去了。其实还不如开门见山,先跳过 Parser 部份,示范 inputKey 任务中直接处理用户的原生输入。

这里有两个最简单的 sbt inputKey 的示例

一. 命令后非空格起全部输入当作一个字符串

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 方法一样传入参数

import complete.DefaultParsers._

val demo2 = inputKey[Unit]("Demo2 inputTask")
demo2 := {
 val args: Seq[String] = spaceDelimited("Input your argument(s)").parsed
 args foreach println
}

我们知道在调用 Java 的主方法时参数可以用空格或 tab 分开,最络作为数组传递到主方法,单个参数若有空格或tab可以用双引号括起来。

> demo2 abc "b cd" 'cde'
abc
b cd
'cde'

从前面我们看到在使用参数之前调用了 Parser 的 parsed 得到合适类型的输入。现在可以开始理解 Parser 的功能了,它其实就像是 FormBean 那样的 Converter, 就是针对输入的字符串,你可以用 Parser[T] 把它转换为任何类型,如字符串到文件类型, 或 Boolean 型等等。sbt 内置了一引起 Parser, 见 DefaultParsers,我们可以在此基础或完全自定义 Parser。

参考: http://www.scala-sbt.org/0.13/docs/Input-Tasks.html

类别: Scala. 标签: , . 阅读(48). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar
wpDiscuz