sbt 中自定义的 Task

sbt, 又是一种自动化构建工具,意为 Simple Build Tool,目前还难副其名,它管理依赖也是用的 Ivy。Scala 相关的项目一般会用它,如 Play2,所以需要来研究下它怎么自定义任务。

sbt 项目可以用 build.sbt 或 project/Build.scala 来定义项目,build.sbt 里写些简单的 settings 表达式,而 Build.scala 就强大,可以写 val, object 和方法定义。而且单个 Build.scala 可以定义多个项目,build.sbt 只用来定义当前项目。build.sbt 和 project/Build.scala 能同时存在,它们的内容会编译到一块。还有一个全局的 build.sbt 文件 ~/.sbt/build.sbt,这里控制所有的项目。

所以我们分别看在 project/Build.scala 和 build.sbt 中如何定义自己的 task

首先看 project/Build.scala,分别由两行完成

val mytask = taskKey[Unit]("This is my customized task")
mytask := { println("Execute customized task")}

完整的一个 project/Build.scala 如下

然后在 sbt  的控制台下就可以执行 mytask 了

> mytask
Execute customized task
[success] Total time: 0 s, completed May 28, 2014 12:04:36 AM

上面说明 mytask 被正确执行了,但是直接用 tasks 命令没有显示 mytask,tasks -v 能查看到。

有个办法可以让 tasks 显示出来,就是创建 TaskKey 时指定 KeyRanks.ATask,以上两行分别替换成

val myTask = TaskKey[Unit]("mytask", "This is my customized task", KeyRanks.ATask)
myTask := { println("Execute customized task") }

注意对应的关系,这时候 tasks 命令显示的是 mytask,并不是变量名 myTask, TaskKey 的第一个字母是大写了。

再看 build.sbt 中如何定义任务,直接附上完整的 build.sbt 代码,同样是两部分组成

这里对前面的 build.sbt 偏见的颠覆,build.sbt 中同样可以 val, 也能写 Scala 语句,不仅局限于 settings 语句。同时让默认的 test 任务依赖于这个 pre_test 任务,执行

sbt_custom_task

关于 sbt 的项目配置有以下几个概念

SettingKey[T] 像  name := "hello" 里的 := 操作返回的就是 SettingKey[T],初始化项目一次性用
TaskKey[T]  用 TaskKey 或 taskKey  定义的,每次任务执行
InputKey[T] 其实是 TaskKey 的一种,只是能带输入参数,如 testOnly someClass

build.sbt 中一行行 := 操作就组成了 Setting[t]

参考:

1. Build Definition
2. Tasks

本文链接 https://yanbin.blog/sbt-customize-task/, 来自 隔叶黄莺 Yanbin Blog

[版权声明] Creative Commons License 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments