You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
name :="learnsbt"
version :="1.0"
scalaVersion :="2.11.7"//定义了task的类型为Unit,key值叫helloTaskvalhelloTask= taskKey[Unit]("say hello")
helloTask := {
println("Hello")
}
运行结果
>reload
[info] Loading project definition from /home/ctao/WorkSpace/scala/learnsbt/project
[info] Set current project to learnsbt (in build file:/home/ctao/WorkSpace/scala/learnsbt/)
> helloTask
Hello
[success] Total time: 0 s, completed Jan 24, 2016 5:28:15 PM
> reload
[info] Loading project definition from /home/ctao/WorkSpace/scala/learnsbt/project
[info] Set current project to learnsbt (in build file:/home/ctao/WorkSpace/scala/learnsbt/)
> helloTask
[success] Total time: 0 s, completed Jan 24, 2016 5:35:18 PM
奇怪,结果呢,要看结果就执行 show taskKey
> show helloTask
[info] hello
[success] Total time: 0 s, completed Jan 24, 2016 5:36:29 PM
> runAllTask
hi task run : hi
hello task run : hello
hi task value is hi
bye task run : bye
hello
hi
bye
[success] Total time: 4 s, completed Jan 24, 2016 5:49:06 PM
sbt入门
什么是sbt
sbt是一个simple build tools,可以进行scala与java的项目管理,支持增量编译,内置scala console
如何开始
安装配置初始化
先安装,安装方式这里就不写了,国内墙比较高,如果没有梯子的用户,请最好将源改成oschina的
具体做法是:
.sbt
文件夹下定义一个名为repositories
的配置文件创建项目
接着创建工程目录,或者选用ide,我通常使用idea,会自动生成工程目录夹以及原始的配置,如果非ide则需要手工在工程目录下创建
build.sbt
文件,手工创建目录,结构类似其中main主要放工程代码,test放测试代码,然后运行sbt,命令为
sbt
进入sbt中scalaSource
来查看scala源码要求的位置,javaSource
resources
中,可运行show unmanagedResources
查看,console
进入scala的Repl中加入依赖
依赖加入也比较简单
可以一条条的加就像这样
具体搜索我是通过mvnrepository.com
当然还有一起加的方法:
到这里就可以基本使用了
记得修改配置后需要
reload
或者update
。写的类运行
执行
run
,如果有多个类就会出现一个列表,输入对应数字选择即可。写的测试运行
执行
test
,方法同上run
这里就基本实现了小白级别的扫盲了
进阶
第一说操作符
:=
是给key分配一个初始表达式,覆盖原来的任何配置+=
是追加一个值到key++=
是追加一个队列,队列中放值,将值追加到key再说task,里面可以定义task,task可以是执行外部的命令,先简单一点
运行结果
当然你也可以定义taskKey的返回类型是String,例如:
运行结果是
奇怪,结果呢,要看结果就执行
show taskKey
下面我们定义多个task,task之间是_并行执行的_ ,这点很关键,看下面的例子
先定义三个task,第一个是hello,第二个是hi,第三个是bye
首先,我们让三个task内部执行只是休眠2s,如果是并行那么结果会是2s,如果串行那么就是6s
结果是2s,验证了我们的说法,下面我们bye要依赖hellotask执行,
具体代码为
结果为:
由此可看出在没有依赖关系的时候是并行,但有依赖关系就是串行,如果我们再设置hi依赖hello,那么就是6s
__
注意:如果互相依赖可能造成死锁,比如a依赖b的value,b里面又依赖a的value,那么就是鸡生蛋和蛋生鸡的问题了,要避免这一点
你会说这么简单的东西有个什么用,当然有用了, 比如我们要创建一个版本信息,值来源于git中的headcommit中的sha,那么我们就可以
执行
show gitHeadCommitSha
就获取到git中的状态信息了,下面我们将创建一个写版本的task,如下
我们运行task,将看到
查看文件
version.properties
剩下的就自己diy了
多工程
有人说我不止一个module,那么应该怎么搞,就像这样
idea中sbt会生成对应的dir,执行
tree -L 3
我们查看build的jar包,会发现2中没有,而1有logback,3则由于依赖1则有logback和1,因此后面我们只需要定义一个通用,再定义一些依赖就好了:
排除jar包
有的时候我们需要排除jar包,类似maven中的
那么我们可以这样做:
由于slf4j有logback和log4j两个实现,我们需要把log4j排除去掉
屏蔽源码:
有的时候我们要过滤源码,那么就是
被注释掉的地方可以将source屏蔽引入,两个是实现的同一个功能
最后给出一个我现在喜欢用的配置
首先project定义
CommonSettings
和一个
Dependencies
然后build.sbt:
The text was updated successfully, but these errors were encountered: