综述
SBT:simple build tools,Scala世界的Maven
- 下载、解压、将
SBT_HOME/bin添加进$PATH即可
- SBT中包含的Scala可通过
$ scala console交互式启动解释器
参数命令
clean:删除所有构建文件
compile:编译源文件:src/main/scala、src/main/java
test:编译运行所有测试
console:进入包含所有编译文件、依赖的classpath的scala
解释器
run <args>:在和SBT所处同一虚拟机上执行项目main class
package:将src/main/resources、src/main/scala、
src/main/java中编译出class打包为jar
help <cmd>:帮助
reload:重新加载构建定义:build.sbt、project.scala
、project.sbt
inspect <key>:查看key描述
show <key[:subkey]>:查看key对应value执行结果
- 例:
show compile:dependencyClasspath
- 以上命令可以在shell中作参数、在SBT命令行作命令
- SBT命令行中历史记录查找同shell
~前缀执行命令表示监视变化,源文件改变时自动执行该命令
项目结构
SBT配置
1 2 3 4 5 6 7 8 9 10 11 12 13
| # ~/.sbt/repositories # 默认依赖仓库设置
[repositories] local <maven_repo_name>: <repo_address> <ivy_repo_naem>: <repo_address>, <address_formation>
# 地址格式可能如下 [orgnanization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]
# ali Maven2 repo aliyun: https://maven.aliyun.com/nexus/content/groups/public/
|
- 需要添加sbt启动参数
-Dsbt.override.build.repos=true使
覆盖默认生效
Build Definition
构建定义:定义在build.sbt中、包含项目构建信息
- 多工程
.sbt构建定义:可为代码中定义多个子项目,结构灵活
- bare
.sbt构建定义
- 构建定义可以包含位于
project目录下的.scala下的文件,
用于定义常用函数、值
多工程.sbt构建定义
1 2 3 4 5 6 7 8 9 10 11 12 13
| lazy val hello = taskKey[Unit]("example task")
val derby = "org.apache.derby" % "derby" % "10.4.1.3"
lazy val root = (project in file(".")) .settings( name := "hello", hello := {prinln("hello")}, libraryDependencies += derby )
|
Bare.sbt构建定义
1 2 3 4
| name := "hello" version := "1.0" scalaVersion := "2.12.8" library.Dependencies += "org.apache.derby" % "derby" % "10.4.1.3"
|
- bare
.sbt构建定义由Setting[_]表达式列表组成
Keys
SettingKey[T]:值仅在子项目载入时计算一次
TaskKey[T]:值每次都需要被计算,可能有副作用
InputKey[T]:值以命令行参数作为输入的任务
- Key可以视为为项目定义的属性、trigger
taskiness(每次执行)可以视为task key的属性
sbt.Keys内建Key
- 内建Key中泛型参数已经确定,定制需要满足类型要求
项目属性
name:项目名称,默认为项目变量名
baseDirectory:项目根目录
sourceDirectories:源码目录
sourceDirectory:源码上层目录?
依赖相关
unmanageBase:指定非托管依赖目录
unmanagedJars:列举unmanagedBase目录下所有jar
的task key
dependencyClasspath:非托管依赖classpath
compile:_:编译时设置
runtime:_:运行时设置
libraryDependecies:指定依赖、设置classpath
resolvers:指定额外解析器,Ivy搜索服务器指示
externalResolvers:组合resolvers、默认仓库的task key
运行相关
package:打包系列Task
- 类型:
TaskKey[File]的task key
- 返回值:生成的jar文件
compile:编译系列Task
.sbt特殊方法
- 常用类型
String等的方法仅在.sbt中可用
- 方法的具体行为、返回值略有差异
XXXXKey[T]:
SettingKey[T]:
String
%:从字符串构造Ivy ModuleID对象
%%:sbt会在actifact中加上项目的scala版本号
- 也可手动添加版本号替代
- 很多依赖会被编译给多个Scala版本,可以确保兼容性
at:创建Resolver对象
依赖
非托管依赖
非托管依赖:lib/目录下的jar文件
- 其中jar被添加进classpath
- 对
compile、test、run、console都成立
- 可通过
dependencyClasspath改变设置[某个]classpath
相关Key使用
1 2 3 4 5 6 7
| dependencyClasspath in Compile += <path> dependencyClasspath in Runtime += <path>
unmanagedBase := baseDirectory.value / "custom_lib"
unmanagedJars in Compile := Seq.empty[sbt.Attributed[java.io.File]]
|
托管依赖
托管依赖:由sbt根据build.sbt中设置自动维护依赖
- 使用Apache Ivy实现托管依赖
- 默认使用Maven2仓库
格式
1 2 3
| dep_exp ::= <groupID> % <artifactID> % <revision>[% <configuraion>] [% "test" | % Test] [% "provided"]
resolver_exp ::= <name> at <location>
|
groupID:
acrtifactID:工件名称
revision:版本号,无需是固定版本号
"latest.integration"
"2.9.+"
[1.0,)
- 可选选项
"test"|Test:仅在Test配置的classpath中出现
"provided":由环境提供,assembly打包时将不打包该
依赖
name:指定Maven仓库名称
location:服务器地址
依赖添加
1 2 3 4 5 6 7 8 9 10 11
| val libraryDependencies = settingKey[Seq[ModuleID]]("Delares managed dependencies")
libraryDependencies += dep_exp
libraryDependencies ++= Seq( dep_exp, dep_exp, <groupID> %% <artifactID> % <revision> )
|
解析器添加
1 2 3 4 5 6 7 8 9 10 11 12
| val resolvers += settingKeys[Seq[Resolver]]("extra resolvers")
resolvers += resolver_exp resolvers += Resolver.mavenLocal resolvers += "Loal Maven Repo" at "file://" + Path.userHome.absolutePath+"/.m2/repository"
externalResolvers := Seq( resolver_exp ) ++ externalResolvers.values
|
externalResolvers中包含默认解析器,sbt会将此列表值拼接
至resolvers之前,即仅修改resolvers仍然会有限使用默认
解析器
其他配置
project/plugins.sbt
1 2 3
|
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6")
|