Sbt构建工具常用操作

概述

作为Scala的标准构建工具,使用风格与Maven类似,由Scala语言写的,参考官方网站,目前的版本是0.13,虽然说Scala的项目可以通过Maven来构建和管理,但是依然推荐Sbt,更适合一些。

安装

有两种安装方式,标准版本的sbt只有基础的工具,构建工程和编译打包等需要的额外的工具在需要的时候会自动下载,比如说需要用2.11的版本来编译scala代码,就回下载当前最新的scala-2.11.7的:

  1. 独立的sbt-launch安装,Windows/Mac/Linux都有对应的安装过程,也是官方的标准工具,包含了sbt标准的命令;
  2. 通过安装typesafe activator,typesafe是一家商业公司,他们发布的这个工具包含了sbt,同时扩展了这个工具,包含了两个新的命令activator ui和activator new.
  3. activator ui可以通过视图的方式来管理构建的工程,在ui上可以查看项目模板、创建、运行、测试工作区内的项目,比较方便,另外typesafe提供了大量的教程代码,针对akka/play的不同的功能特性都有一些example代码,可以直接通过ui下载教程查看;
  4. activator new可以快速的创建项目,类似于maven通过选择archetype来快速创建项目,typesafe提供了很多种模板,包括了web项目,akka, spark,hadoop等等template,根据需要可以选择一种原型作为基础来修改。

配置

sbt虽然默认使用的是maven的仓库,但是是使用ivy来管理依赖,默认的本地缓存也是使用的是ivy的目录结构,与maven的.m2目录不同,是在用户目录下的.ivy目录下,这样会导致如果本地既有maven项目又有sbt的项目,很多jar会存在两份,浪费空间。优点在于ivy支持更智能的依赖解析方式,比如版本号支持区间的形式,[2.4.0,)代表ivy会选择一个在你设定的约束范围内最新的模块下载,保持自动更新。
  需要注意的是除了缓存的目录不同,如果我们要使用公司内部的nexus服务器来下载依赖模块,需要的配制也与maven不同,maven使用的是.m2/settings.xml来管理全局配制,设置中央仓库,自定义的仓库以及验证的用户名密码等。sbt的配制都在.sbt目录下,除了自身需要的boot launchers目录,需要添加或者修改两个文件:

1. Repositories配置

repositories 全局的resolvers仓库地址,默认的只有maven2的central repository,这里我们需要加上一些自己的配制,才能够使用我们自己的nexus仓库,当然也可以在自己的项目具体的build.sbt里边增加,不过鉴于这个是全局配置放在这里比较方便:
[repositories] local oschina:http://maven.oschina.net/content/groups/public/ oschina-ivy:http://maven.oschina.net/content/groups/public/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] sbt-releases-repo: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] sbt-plugins-repo: http://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext] maven-central: http://repo1.maven.org/maven2/ maven-releases: http://teamwork.kmtongji.com/nexus/content/groups/public
  在上边的例子中,我们包含了7个仓库,在下载依赖的时候会按照上边的顺序,首先检查local的目录下有没有,如果没有优先选择oschina->sbt->maven官方的地址去下载,oschina是国内的一个镜像,同步速度和带宽都不错,一般情况可以替代官方的仓库,而我们内部的nexus放到了最后,当然这个顺序根据实际情况可以自己调节,因为我们本地的nexus也缓存了大量的模块,可以把他放到靠前的位置。
需要配置-Dsbt.override.build.repos=true,加入到sbtopts文件里边,用来强制覆盖默认的仓库,如果要使用自定义的repositories文件地址,还需要配置-Dsbt.repository.config=/path/repositories, 同时推荐加大sbt所使用的mem大小,也是在sbtopts文件中修改。

2. Http authentication for local repositories

一般情况我们本地的nexus仓库都是有网关密码的,不能随便访问,因此如果sbt在下载的时候需要指定credential,因为sbt本身是一种类似scala的语言,通常用程序来实现就是在build.sbt加上这么一行:
Credentials.add("Sonatype Nexus Repository Manager", "nexusHostIp", "nexususername", "nexuspassword")
更好的办法是把credential放到一个文件:
credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")
但是这样需要在所有的工程里边加这么一句,很是麻烦,作为通用的配制,我们可以让他在更基础的文件里边调用,因此最终的方法如下,先把credential放到一个文件,这里我们选择的是~/.sbt/.credentials, 内容如下:
realm=Sonatype Nexus Repository Manager host=teamwork.kmtongji.com user=xxxxx password=xxxxx
接下来我们在sbt配置目录下创建一个公共调用的文件~/.sbt/0.13/plugins/credentials.sbt,内容如下:
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
将调用放到底层加载过程中,因此具体的credentials文件放到哪里不那么重要,重点是调用这行代码,可以隐含的加载默认的credentials
上边只这展示了一个的例子,通过realm来匹配验证的用户名密码,只对http basic authentication有效,如果需要多个realm,应该也可以通过toml的配制方式增加[xxxx]的section区分,并没有测试过,只是猜测。

另外,需要注意的是,如果sbt在运行的时候所在的工程目录是一个本地没有的sbt版本,需要进行下载,这时候如果我们使用自己的私服比如JFrog artifactory来加速下载,credential会出现找不到的问题,因为sbt在升级自身的时候比较特殊,是通过SBT_CREDENTIALS这个环境变量来识别credentials未知的,并不会读我们在credentials.sbt里边配置的路径,因此这个环境变量是必须的。

build.sbt

sbt生成的代码目录结构与maven类似,只是会多一个project目录,最外层是整个项目的构建的build.sbt文件,再project目录下会有plugin.sbt用来控制plugin的加载。对于单个工程的项目构建只需要在build.sbt里边直接写相关的settings,包括名字,依赖关系等,不需要外层的变量,不过更多时候我们需要多项目工程构建,这就需要有一个根项目以及里边的子模块,模块之间存在一定的依赖关系,这就需要每个工程对应一个变量,一般我们会用lazy val来生命,只有在用到的时候才会加载这部分,整个文件就是一个简单的脚本程序,不再多说。
整个结构一般情况下包含三部分,

  • common settings, 这个配制会被其他的工程所使用,可以在后续覆盖其中一部分配制,
  • root项目,用来表明这是一个多工程的项目,列举出他所包含的工程,在根目录执行sbt compile等命令的时候会按顺序将子模块也进行相关的处理,一般也在这部分启动或者禁用某些插件
  • 最后就是各个项目的定义或者说自定义的task了

plugin.sbt

这个文件比较简单,一行行的包含了所添加的插件,插件的启用禁用可以在build文件里边控制,举例说明:
addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.0.3")

常用命令

sbt批处理的命令与maven有很多相似,不过sbt有两种模式,一种交互界面,输入sbt进入之后,可以在新的shell输入各种命令,一种是批处理命令例如sbt clean compile 与maven类似,sbt还有一种可以实时编译的命令 ~compile在文件改动后会自动编译,且是增量编译,比较方便。
常用的命令包括clean compile test run package console reload help,需要特别注意的是run命令,默认情况执行run命令,这个task所运行的jvm与当前sbt自身运行的jvm是同一个,如果需要给run task设置单独的javaOptions并独立出一个进程来运行,则需要特殊的声明,在build.sbt中举例,比如一个工程的settings:
.settings( name := "aco-queen", javaOptions += "-Dconfig.resource=./queen.conf", // Do not work, you have to run with 'sbt -Dconfig.resource=./queen.conf queen/run' fork in(Test, run) := true, // To enable java options , fork run process to a new jvm separated with sbt )
注意其中的javaOptions要生效,前提是有下边的fork语句,在run和test的时候fork新的进程来执行。
当然之前的javaOptions并没有生效,其实如果是指定一些property直接在sbt命令里边加上就好,会传递给具体的jvm虚拟机里边,类似于直接使用java -Dxxxx=xxxx

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容