sbt 简介
sbt
全称Simple Build Tool
,是Scala
项目的标准构建工具,类似于Java
下的Maven
/Groovy
中的Gradle
。
与其它Java
构建工具类似,sbt
的核心功能如下:
- 项目的构建。
- 项目依赖自动化管理。
- 提供统一的工程结构。
- 提供交互式的
sbt shell
。
安装与配置
主流Linux
发行版的仓库中,一般都包含sbt
,可以使用发行版的包管理器安装sbt
,以ArchLinux
为例:
# pacman -S sbt
在Windows环境下,可以从官网http://www.scala-sbt.org/download.html
中下载。
下载完成之后解压并将目录下的bin
目录加入PATH
中。
如果已经安装了Activator
,则无需再安装sbt
,Activator
中已经包含了sbt
。
启动与使用
在任意目录下输入sbt
指令,即可进入sbt shell
,sbt
会将当前路径作为sbt
项目的根目录。
终端会输入如下信息:
[info] Set current project to sbt (in build file:xxx...) >
若路径为有效的sbt
项目路径,则在sbt shell
中输入run
指令会尝试编译源码执行项目。
旧版的sbt
中(sbt 0.7.x
之前),在sbt shell
中输入run
指令会在路径下生成完整的sbt项目结构,但新版的sbt已不提供此特性(可使用sbt new
指令创建项目)。
常见指令如下:
-
compile
编译项目 -
update
更新依赖 -
test
运行测试用例 -
run
运行项目 -
clean
清理项目缓存 -
package
将项目打包 -
console
进入Scala REPL -
reload
重新加载项目的build.sbt
构建配置
sbt
指令在sbt shell
内使用,部分指令也可作为参数跟在sbt
指令之后直接在命令行中使用。
使用 Giter8 模版
Giter8
是由Nathan Hamblen
在2010
年开始发起的模版项目,目前由foundweekends
项目维护。
在sbt 0.13.13
版本后,可使用sbt new
指令创建基于Giter8
模版的项目:
$ sbt new [Giter8模版名称]
使用sbt new
指令新建模板项目,根据模板类型,会交互式地要求输入一些项目信息。
之后会在当前目录/项目名称
路径下生成指定模板的目录结构。
Lightbend
系列的各项技术均提供了基于Giter8
的官方项目模版,常用模版名称如下:
-
scala/scala-seed.g8
普通Scala项目模版 -
akka/akka-scala-seed.g8
Akka项目模版 -
playframework/play-scala-seed.g8
PlayFramework项目模版
关于 No Scala version specified or detected 错误
当sbt
版本升级后,若~/.ivy2/cache
路径下存在旧版sbt
的jar
包,则在终端执行sbt
指令时,会出现以下错误输出:
Error during sbt execution: No Scala version specified or detected
出现错误的原因是存在旧版本的sbt
包缓存,解决方案是移除~/.sbt
和~/.ivy2/cache/org.scala-sbt
目录。
执行以下指令:
$ rm ~/.sbt ~/.ivy2/cache/org.scala-sbt
项目结构
sbt
项目结构与Maven
项目类似。
一个基本的sbt
项目具有以下目录结构:
项目名称
├── build.sbt # 构建定义
├── project
│ ├── plugins.sbt # 添加sbt插件
│ └── build.properties # 构建规则与参数
└── src # 源码目录
├── main
│ ├── resources
│ └── scala
│ ├── Xxx.scala
│ ├── Xxx.scala
│ └── ...
└── test
├── resources
└── scala
├── Xxx.scala
├── Xxx.scala
└── ...
新创建的项目没有target
目录,在sbt shell
中执行了run
后会生成target
和project/target
目录。 target
目录中包含的所有内容均由编译系统生成,将项目目录加入版本控制时需要忽略这些目录。
依赖管理
通过设定build.sbt
文件中的libraryDependencies
变量即可向项目中添加托管依赖。 libraryDependencies
配置项实际上是一个类型为sbt.SettingKey[scala.Seq[sbt.ModuleID]]
的变量。
每一项依赖由sbt.ModuleID
类型定义,一个具体的依赖项格式如下所示:
// 普通依赖,通常适用于Java依赖包
groupID % artifactID % revision
// 在指定配置下的依赖
groupID % artifactID % revision % configuration
// 对于开放源码的库,可以指定在添加依赖时同时下载库源码和Java DOC
groupID % artifactID % revision % withSource() withJavadoc()
对于多数使用Scala开发的项目,项目的artifactID
命名上通常会以使用Scala版本号作为结尾(Scala
编译器相关模块除外,如scala-reflect
、scala-compiler
等)。
在添加Scala
项目依赖时,使用%%
操作符连接groupID
和artifactID
,则会将当前Scala版本号追加到artifactID
上:
groupID %% artifactID % revision
等价于:
groupID % artifactID_[Scala版本] % revision
以Scala 2.12
的Akka 2.4.17
为例,依赖信息为:
"com.typesafe.akka" %% "akka-actor" % "2.4.17" //省略Scala版本信息
"com.typesafe.akka" % "akka-actor_2.12" % "2.4.17" //两种表示方式等价
sbt.SettingKey
类型重载了+=
和++=
运算符:
-
+=
运算符用于添加单项依赖,如:libraryDependencies += groupID % artifactID % revision
-
++=
运算符用于添加多个依赖序列,如:libraryDependencies ++= Seq( groupID0 % artifactID0 % revision0, groupID1 % artifactID1 % revision1, ... )
常用依赖
sbt
依赖的描述信息与Maven
相同,sbt
允许直接添加Maven
仓库的依赖,包的信息可以在Maven中心仓库搜索到,地址为http://search.maven.org/
。
一些常用包的GroupId
和ArtifactId
信息如下:
包介绍 | GroupId | ArtifactId |
---|---|---|
MySQL JDBC Driver | mysql | mysql-connector-java |
Scala Reflect | org.scala-lang | scala-reflect |
Scala Swing | org.scala-lang.modules | scala-swing_[Scala版本号] |
Scala Test | org.scalatest | scalatest_[Scala版本号] |
ScalaFx | org.scalafx | scalafx_[Scala版本号] |
Slick | com.typesafe.slick | slick_[Scala版本号] |
Akka | com.typesafe.akka | akka-actor_[Scala版本号] |
Lightbend Activator (已废弃)
Activator
提供了成套的Scala
开发环境,相当于:
Scala编译器 + sbt + Play Framework + Akka + 项目模版 + 基于Play的WEB端项目管理
Activator
内置了sbt,可以直接使用Activator
管理、构建sbt项目。
安装与配置
多数Linux发行版没有将Activator
添加到仓库中,因而无论是Linux/Windows
环境下,都需要从官网下载Activator
。
配置Activator
方式与sbt
类似。
从http://www.lightbend.com/activator/download
下载完整版的Activator
,解压后将bin
目录加入PATH
环境变量中即可。
基本操作
在普通目录中输入activator
指令会在浏览器中打开Activator的帮助页面。
在sbt
项目目录中输入activator
指令会进入sbt shell
。
其它常见的指令:
-
$ activator ui
进入WEB端的Activator界面 -
$ activator shell
进入sbt交互shell -
$ activator list-templates
列出模版列表
Activator
中带有大量的预定义项目模版,使用模版创建项目:
$ activator new [项目名称] [模版名称]
Activator
同样支持与sbt
相同的指令。
后记
在2017-4-24
的Lightbend
官方新闻(https://www.lightbend.com/blog/introducing-a-new-way-to-get-started-with-lightbend-technologies-and-saying-goodbye-to-activator
)中,宣布在2017-5-24
停止对Activator
的支持。
新闻中指出了Activator
在以下的情形存在缺陷:
- 将
Activator
良好地运行在多样的机器类型上。 - 将
Activator
可靠地运行在多样的网络环境上。 - 处理双重要求:
保持更新
与从不更新
。
鉴于Activator
无法良好地实现以上要求,Lightbend
停止了对Activator
的支持并提供了以下替代方案:
-
基于
Web
技术的Project Starter
:在页面
http://developer.lightbend.com/start/
中直接创建项目模版并将其下载到本地。 -
使用新增的
sbt new
指令:Giter8
项目提供了Lightbend
各类技术对应的项目模版,使用sbt new [Giter8模版名称]
创建对应的项目模版。