一 sbt的使用 SBT = (not so) Simple Build Tool,是scala的構建工具,與java的maven地位相同。其設計宗旨是讓簡單的項目可以簡單的配置,而複雜的項目可以複雜的配置。 sbt使用了ivy,預設將依賴包保存在用戶目錄.ivy下麵,如果覺得預設路徑不合適,可以把 ...
一 sbt的使用
SBT = (not so) Simple Build Tool,是scala的構建工具,與java的maven地位相同。其設計宗旨是讓簡單的項目可以簡單的配置,而複雜的項目可以複雜的配置。
sbt使用了ivy,預設將依賴包保存在用戶目錄.ivy下麵,如果覺得預設路徑不合適,可以把sbt.boot.properties文件的[boot]和[ivy]目錄修改為指定目錄,比如ivy-home是cache依賴包路徑,打比方可以改為/home/user/.../ivy-home/ 或者 F:\...\ivy-home\,然後指定路徑下生成的cache目錄將具體存儲sbt項目依賴包。
1 sbt項目目錄
和maven一樣,sbt有約定了一個通用的目錄結構,使用約定的結構會使後面的工作簡單很多。項目配置可以在build.sbt文件里定義,也可以在base/project/build.scala文件里定義,一般情況下build.sbt就已經足夠,除非多工程項目或者需要很多特殊定義的項目
base/ build.sbt //構建配置文件 /project //也是構建配置的一部分 build.scala //高級配置,可選 /src /main /scala /java /resources /test /scala /java /resources base代表項目的根目錄
2.sbt命令(如果mvn命令)
sbt有哪些命令可用?輸入help命令查詢,即會列出一堆可用的命令,比如exit,reload等,不知道某個命令的作用?help 命令名,比如輸入help exit顯示exit命令的作用。
列出的命令里並沒有compile,test等常用的命令?因為那些不是sbt的命令而是當前工程的task. 輸入 tasks命令,就可以看見 compile,test,package等等任務的說明瞭。
想查看項目的配置?用show命令,輸入show name,看當前項目的名字,輸入show libraryDependencies看當前項目依賴的庫,libraryDependencies太長記不住?輸入lib後按tab鍵! 交互視窗是有tab提示的!輸入help show,你可以看到show命令的作用是顯示配置的值,如果show之後跟的是任務,則執行該任務並顯示任務執行的結果。 你可以試試show compile看什麼結果,如果你不想執行compile,而是想看命令的說明,請用inspect命令,inspect命令比較複雜,執行後輸出的結果也比較複雜,具體這個命令的作用是什麼請help inspect, 不過得等理解了build definition的含義後才能看懂help說的是什麼。。。
常用的任務則有compile, test, run,package,doc等,請顧名思義或自行help之。另外這些任務常常還有些變種,比如package-doc,package-src等,用tasks命令查看任務的列表,必有一款適合您
有一個強大的任務不得不特別拎出來說一下:console
輸入console回車,會在當前會話內啟動一個REPL,不要告訴我你不知道REPL是scala解釋器的意思。。。就是你在命令行下輸入scala回車後進入的那個交互界面。
強大的是,sbt會載入你的項目依賴的全部jar包和你自己的代碼! 你可以在這個解釋器里實驗你的半成品。 我的模板工程里有一個sample/Account.scala文件,十幾行很簡單的代碼,你可以看一下,然後在console視窗里玩弄Account類和Account伴生對象. 不過別忘了先import sample._
因為依賴的jar包也都被載入了,所以對於那些你可能還不熟悉的第三方庫,你有可以在console里玩個痛快!這功能很給力,誰用誰知道。
順便在提一下,sbt命令有3種執行模式:
1、互動式,即上文所描述的
2、批處理式,即在命令行下輸入sbt 命令名來執行,比如sbt compile就會編譯代碼,而不進入交互模式
3、連綿不絕式,在命令名前加上~號,即會進入連綿不絕模式,比如~compile,會編譯當前代碼,然後監聽代碼改變,每當你編輯了代碼並保存後,sbt就會自動編譯代碼,~test也一樣,當你修改代碼後自動編譯並運行單元測試。按回車鍵可退出此模式。
3.build definition釋義
你前面應該試過show name和show libraryDependencies了吧?show出來的結果就是來自你的build.sbt文件,也就是build definition了。打開build.sbt就可以看到name := “sbt11template” 還有其他的一堆xxx := xxxx,很顯然的,這就是個key-value pair, sbt就是讀取配置文件並構建一個key-value的map. 但是在build.sbt裡面並非key := value, 而是key := expression. 文件里的每一行其實是一句scala語句,不行你可以試試把
name := “sbt11template” 改成
name := {“sbt11template”.toUpperCase}
然後reload, 再show name,你會看到變成大寫的SBT11TEMPLATE
:=是最常用的方法,其作用就是將key設置成expression的值,相同的key如果被多次賦值,則後面的值會覆蓋掉前面的值。適用於簡單類型的key,比如name,version等。
其他的常用方法有
+=,將值添加進現有值里,適用於集合類型的key,比如libraryDependencies
++=,將一個集合值加入當前集合里
~= ,這個牛X,你在~=後面寫個函數,~=將key的當前值傳給你的函數,然後將函數結果作為新值,比如你可以在name := xxx後面再來一句
name ~= { _. toUpperCase },一樣是把name變成大寫
<<= 將另一個key的值賦給當前key,比如auther <<= name ,這個方法還有個高級用法,你可以組合多個其他key的值,賦給當前key,用文檔里的例子
name <<= (name, organization, version) { (n, o, v) => "project " + n + " from " + o + " version " + v }
- 1
還有適用於集合類型的版本
<+= 和 <++=
這些語法的官方文檔在此
https://github.com/harrah/xsbt/wiki/Getting-Started-More-About-Settings
4.
. 依賴管理
對於不打算通過官方repository管理的第三方庫,在項目目錄下建個lib目錄,把jar包扔進去就行了。
希望sbt待為管理的則在build.sbt里用下麵的語法加入
libraryDependencies += groupID % artifactID % revision % configuration
- 1
% configuration是可選的,表示某依賴庫只在特定配置中需要,比如模板項目里的”org.specs2” %% “specs2” % “1.7.1” % “test” 是單元測試框架,只在測試時需要。
如果你視力好,會看到其中有個 %%,而不是一個%,這表示要求sbt尋找用當前你配置的scala版本編譯出來的jar包,這是因為scala不同版本編譯出來的結果會不相容(悲劇),希望以後scala社區會解決這不相容的問題。。。
對於依賴的java語言寫的庫的jar包,就沒這問題了,比如libraryDependencies += “org.slf4j” % “slf4j-api” % “1.6.4” 就不需要%%了
配置好依賴後,運行sbt update,sbt會自動到maven庫和scala官方庫里去找這些jar包並下載到你的用戶目錄的.ivy2目錄裡面,如果你不同的項目用了相同的庫,則sbt下載一次就夠了。
如果你希望sbt從你自己配置的repository里下載,使用這個語法:
resolvers += name at location
- 1
比如
resolvers += "Scala-Tools Maven2 Snapshots Repository" at "http://scala-tools.org/repo-snapshots"
- 1
所有的一切都是通過key類配置的,key 的列表在http://harrah.github.com/xsbt/latest/sxr/Keys.scala.html
二 play的使用
1 .sbt的下載安裝(略)
2. paly framework的安裝
其實根本不用安裝,建項目也只是直接從對應的模板開始
如果idea是Ultimate收費版的,什麼都不用做,可以直接建play2項目
如果是社區版,那就沒辦法了,只能用導入的方式
(1)創建項目,依賴與g8模板
Java seed template
sbt new playframework/play-java-seed.g8
Scala seed template
sbt new playframework/play-scala-seed.g8
(2)現在可以輸入 項目名、組織名、Scala 版本、Play 版本、SBT 版本:
(3)試著運行這個項目, sbt run直接運行
或者sbt進入命令行環境,再輸入run
(4)idea import這個項目,利用build sbt導入
(5)等待sbt相關依賴載入完成
(6)sbt shell 中運行sbt run 或者sbt console中運行 sbt run
即可用瀏覽器打開http://localhost:9090 看到welcome to play
(7)編譯命令用compile,測試命令用test