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 如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import sbt._ import Keys._ object HelloBuild extends Build { val mytask = taskKey[Unit]("This is my customized task") lazy val root = Project(id = "root", base = file(".")) .settings( name := "hello", version := "1.0" ) .settings( mytask := { println("Execute customized task") System.setProperty("abc", "false") } ) } |
然后在 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 代码,同样是两部分组成
1 2 3 4 5 6 7 8 |
val pre_test = taskKey[Unit]("Do something before test") pre_test := { println("Execute pre_task task") System.setProperty("some", "true") } test <<= (test in Test) dependsOn pre_test |
这里对前面的 build.sbt 偏见的颠覆,build.sbt 中同样可以 val, 也能写 Scala 语句,不仅局限于 settings 语句。同时让默认的 test 任务依赖于这个 pre_test 任务,执行
关于 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
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。