概述
作為Scala的標(biāo)準(zhǔn)構(gòu)建工具,使用風(fēng)格與Maven類似抬伺,由Scala語言寫的怎顾,參考官方網(wǎng)站读慎,目前的版本是0.13,雖然說Scala的項目可以通過Maven來構(gòu)建和管理槐雾,但是依然推薦Sbt夭委,更適合一些。
安裝
有兩種安裝方式募强,標(biāo)準(zhǔn)版本的sbt只有基礎(chǔ)的工具株灸,構(gòu)建工程和編譯打包等需要的額外的工具在需要的時候會自動下載崇摄,比如說需要用2.11的版本來編譯scala代碼,就回下載當(dāng)前最新的scala-2.11.7的:
- 獨立的sbt-launch安裝慌烧,Windows/Mac/Linux都有對應(yīng)的安裝過程逐抑,也是官方的標(biāo)準(zhǔn)工具,包含了sbt標(biāo)準(zhǔn)的命令;
- 通過安裝typesafe activator屹蚊,typesafe是一家商業(yè)公司厕氨,他們發(fā)布的這個工具包含了sbt,同時擴展了這個工具汹粤,包含了兩個新的命令activator ui和activator new.
- activator ui可以通過視圖的方式來管理構(gòu)建的工程命斧,在ui上可以查看項目模板、創(chuàng)建嘱兼、運行国葬、測試工作區(qū)內(nèi)的項目,比較方便遭京,另外typesafe提供了大量的教程代碼胃惜,針對akka/play的不同的功能特性都有一些example代碼,可以直接通過ui下載教程查看;
- activator new可以快速的創(chuàng)建項目哪雕,類似于maven通過選擇archetype來快速創(chuàng)建項目船殉,typesafe提供了很多種模板,包括了web項目斯嚎,akka, spark,hadoop等等template利虫,根據(jù)需要可以選擇一種原型作為基礎(chǔ)來修改。
配置
sbt雖然默認(rèn)使用的是maven的倉庫堡僻,但是是使用ivy來管理依賴糠惫,默認(rèn)的本地緩存也是使用的是ivy的目錄結(jié)構(gòu),與maven的.m2目錄不同钉疫,是在用戶目錄下的.ivy目錄下硼讽,這樣會導(dǎo)致如果本地既有maven項目又有sbt的項目,很多jar會存在兩份牲阁,浪費空間固阁。優(yōu)點在于ivy支持更智能的依賴解析方式,比如版本號支持區(qū)間的形式城菊,[2.4.0,)代表ivy會選擇一個在你設(shè)定的約束范圍內(nèi)最新的模塊下載备燃,保持自動更新。
??需要注意的是除了緩存的目錄不同凌唬,如果我們要使用公司內(nèi)部的nexus服務(wù)器來下載依賴模塊并齐,需要的配制也與maven不同,maven使用的是.m2/settings.xml來管理全局配制,設(shè)置中央倉庫况褪,自定義的倉庫以及驗證的用戶名密碼等撕贞。sbt的配制都在.sbt目錄下,除了自身需要的boot launchers目錄窝剖,需要添加或者修改兩個文件:
1. Repositories配置
repositories 全局的resolvers倉庫地址麻掸,默認(rèn)的只有maven2的central repository酥夭,這里我們需要加上一些自己的配制赐纱,才能夠使用我們自己的nexus倉庫,當(dāng)然也可以在自己的項目具體的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.km#com/nexus/content/groups/public
??在上邊的例子中疙描,我們包含了7個倉庫,在下載依賴的時候會按照上邊的順序讶隐,首先檢查local的目錄下有沒有起胰,如果沒有優(yōu)先選擇oschina->sbt->maven官方的地址去下載,oschina是國內(nèi)的一個鏡像巫延,同步速度和帶寬都不錯效五,一般情況可以替代官方的倉庫,而我們內(nèi)部的nexus放到了最后炉峰,當(dāng)然這個順序根據(jù)實際情況可以自己調(diào)節(jié)畏妖,因為我們本地的nexus也緩存了大量的模塊,可以把他放到靠前的位置疼阔。
需要配置-Dsbt.override.build.repos=true戒劫,加入到sbtopts文件里邊,用來強制覆蓋默認(rèn)的倉庫婆廊,如果要使用自定義的repositories文件地址迅细,還需要配置-Dsbt.repository.config=/path/repositories, 同時推薦加大sbt所使用的mem大小,也是在sbtopts文件中修改淘邻。
2. Http authentication for local repositories
一般情況我們本地的nexus倉庫都是有網(wǎng)關(guān)密碼的茵典,不能隨便訪問,因此如果sbt在下載的時候需要指定credential宾舅,因為sbt本身是一種類似scala的語言统阿,通常用程序來實現(xiàn)就是在build.sbt加上這么一行:
Credentials.add("Sonatype Nexus Repository Manager", "nexusHostIp", "nexususername", "nexuspassword")
更好的辦法是把credential放到一個文件:
credentials += Credentials(Path.userHome / ".ivy2" / ".credentials")
但是這樣需要在所有的工程里邊加這么一句,很是麻煩贴浙,作為通用的配制砂吞,我們可以讓他在更基礎(chǔ)的文件里邊調(diào)用,因此最終的方法如下崎溃,先把credential放到一個文件蜻直,這里我們選擇的是~/.sbt/.credentials, 內(nèi)容如下:
realm=Sonatype Nexus Repository Manager host=teamwork.km#com user=xxxxx password=xxxxx
接下來我們在sbt配置目錄下創(chuàng)建一個公共調(diào)用的文件~/.sbt/0.13/plugins/credentials.sbt,內(nèi)容如下:
credentials += Credentials(Path.userHome / ".sbt" / ".credentials")
將調(diào)用放到底層加載過程中概而,因此具體的credentials文件放到哪里不那么重要呼巷,重點是調(diào)用這行代碼,可以隱含的加載默認(rèn)的credentials
上邊只這展示了一個的例子赎瑰,通過realm來匹配驗證的用戶名密碼王悍,只對http basic authentication有效,如果需要多個realm餐曼,應(yīng)該也可以通過toml的配制方式增加[xxxx]的section區(qū)分压储,并沒有測試過,只是猜測源譬。
另外集惋,需要注意的是,如果sbt在運行的時候所在的工程目錄是一個本地沒有的sbt版本踩娘,需要進行下載刮刑,這時候如果我們使用自己的私服比如JFrog artifactory來加速下載,credential會出現(xiàn)找不到的問題养渴,因為sbt在升級自身的時候比較特殊雷绢,是通過SBT_CREDENTIALS這個環(huán)境變量來識別credentials未知的,并不會讀我們在credentials.sbt里邊配置的路徑理卑,因此這個環(huán)境變量是必須的翘紊。
build.sbt
sbt生成的代碼目錄結(jié)構(gòu)與maven類似,只是會多一個project目錄傻工,最外層是整個項目的構(gòu)建的build.sbt文件霞溪,再project目錄下會有plugin.sbt用來控制plugin的加載。對于單個工程的項目構(gòu)建只需要在build.sbt里邊直接寫相關(guān)的settings中捆,包括名字鸯匹,依賴關(guān)系等,不需要外層的變量泄伪,不過更多時候我們需要多項目工程構(gòu)建殴蓬,這就需要有一個根項目以及里邊的子模塊,模塊之間存在一定的依賴關(guān)系蟋滴,這就需要每個工程對應(yīng)一個變量染厅,一般我們會用lazy val來生命,只有在用到的時候才會加載這部分津函,整個文件就是一個簡單的腳本程序肖粮,不再多說。
整個結(jié)構(gòu)一般情況下包含三部分尔苦,
- common settings涩馆, 這個配制會被其他的工程所使用行施,可以在后續(xù)覆蓋其中一部分配制,
- root項目魂那,用來表明這是一個多工程的項目蛾号,列舉出他所包含的工程,在根目錄執(zhí)行sbt compile等命令的時候會按順序?qū)⒆幽K也進行相關(guān)的處理涯雅,一般也在這部分啟動或者禁用某些插件
- 最后就是各個項目的定義或者說自定義的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命令咖杂,默認(rèn)情況執(zhí)行run命令庆寺,這個task所運行的jvm與當(dāng)前sbt自身運行的jvm是同一個,如果需要給run task設(shè)置單獨的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新的進程來執(zhí)行。
當(dāng)然之前的javaOptions并沒有生效伍绳,其實如果是指定一些property直接在sbt命令里邊加上就好踊挠,會傳遞給具體的jvm虛擬機里邊,類似于直接使用java -Dxxxx=xxxx