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 REPLreload
重新加载项目的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模版名称]
创建对应的项目模版。