综述
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")
|