Sbt構(gòu)建工具常用操作

概述

作為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的:

  1. 獨立的sbt-launch安裝慌烧,Windows/Mac/Linux都有對應(yīng)的安裝過程逐抑,也是官方的標(biāo)準(zhǔn)工具,包含了sbt標(biāo)準(zhǔn)的命令;
  2. 通過安裝typesafe activator屹蚊,typesafe是一家商業(yè)公司厕氨,他們發(fā)布的這個工具包含了sbt,同時擴展了這個工具汹粤,包含了兩個新的命令activator ui和activator new.
  3. activator ui可以通過視圖的方式來管理構(gòu)建的工程命斧,在ui上可以查看項目模板、創(chuàng)建嘱兼、運行国葬、測試工作區(qū)內(nèi)的項目,比較方便遭京,另外typesafe提供了大量的教程代碼胃惜,針對akka/play的不同的功能特性都有一些example代碼,可以直接通過ui下載教程查看;
  4. 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冲杀,一起剝皮案震驚了整個濱河市效床,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌权谁,老刑警劉巖剩檀,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旺芽,居然都是意外死亡沪猴,警方通過查閱死者的電腦和手機卤妒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來字币,“玉大人则披,你說我怎么就攤上這事∠闯觯” “怎么了士复?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翩活。 經(jīng)常有香客問我阱洪,道長,這世上最難降的妖魔是什么菠镇? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任冗荸,我火速辦了婚禮,結(jié)果婚禮上利耍,老公的妹妹穿的比我還像新娘蚌本。我一直安慰自己,他們只是感情好隘梨,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布程癌。 她就那樣靜靜地躺著,像睡著了一般轴猎。 火紅的嫁衣襯著肌膚如雪嵌莉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天捻脖,我揣著相機與錄音锐峭,去河邊找鬼。 笑死可婶,一個胖子當(dāng)著我的面吹牛沿癞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扰肌,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼抛寝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曙旭?” 一聲冷哼從身側(cè)響起盗舰,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎桂躏,沒想到半個月后钻趋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡剂习,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年蛮位,在試婚紗的時候發(fā)現(xiàn)自己被綠了较沪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡失仁,死狀恐怖尸曼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萄焦,我是刑警寧澤控轿,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站拂封,受9級特大地震影響茬射,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冒签,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一在抛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萧恕,春花似錦刚梭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惰说,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缘回,已是汗流浹背吆视。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酥宴,地道東北人啦吧。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像拙寡,于是被迫代替她去往敵國和親授滓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容