SBT和Lightbend Activator的使用

时间:2022-10-06 23:11:12

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,则无需再安装sbtActivator中已经包含了sbt

启动与使用

在任意目录下输入sbt指令,即可进入sbt shellsbt会将当前路径作为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 Hamblen2010年开始发起的模版项目,目前由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路径下存在旧版sbtjar包,则在终端执行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后会生成targetproject/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-reflectscala-compiler等)。

在添加Scala项目依赖时,使用%%操作符连接groupIDartifactID,则会将当前Scala版本号追加到artifactID上:

groupID %% artifactID % revision

等价于:

groupID % artifactID_[Scala版本] % revision

Scala 2.12Akka 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/

一些常用包的GroupIdArtifactId信息如下:

包介绍 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-24Lightbend官方新闻(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模版名称]创建对应的项目模版。