1. 程式人生 > >sbt專案構建過慢解決辦法

sbt專案構建過慢解決辦法

最近因為環境遷移的原因需要重新構建一下之前的scala專案,然而被sbt過慢折磨的要死,打了一個多小時遊戲還是卡在同一個進度不動,特地研究了一下處理了一波。

sbt構建過慢原因

sbt是scala專案經常用到的一個工具,主要用於構建等操作。然而,sbt的構建或者初次下載等都需要很長很長的時間,主要原因如下:

  • sbt的所有預設倉庫都設在國外
  • 從某一個版本開始sbt預設使用https訪問倉庫們(據說,有待考證,因為在sbt的下載過程中看到的仍然是downloading http://balabala
  • 由於眾所周知的原因,通往國外的https連結十分不穩定
  • sbt並沒有設定斷網重試機制

因此,sbt在下載的過程中會很慢並且經常會卡住不動。

解決方法

解決方法主要有兩種:

  • 使用代理
  • 修改預設倉庫,使用國內映象資源

然而,使用了這幾種方法之後仍然會經常卡住,具體原因不詳,解決辦法為簡單粗暴的ctrl+c人工手動重傳,原理仍然不詳,如有了解的話求告知

使用代理

使用代理的時候注意需要設定命令列代理,使用圖形化設定全域性代理取決於作業系統和桌面環境的具體實現,有時不一定能夠成功

對於命令列代理設定http代理方法如下:

  • windows
set http_proxy=http://%proxy%:%port%
set http_proxy_user=%username%
set http_proxy_pass=%passwd%
  • linux
export http_proxy=$username:$passwd@$proxy:$prot

設定vpn代理的方式可以看這裡(TODO:引用)

然而個人測試的話使用了http代理依然會卡住,特別是對於大檔案而言,通常需要ctrl+c許多次而且每次都要等上十分鐘以上才敢ctrl+c,不過vpn代理十分好用,強烈推薦。

使用國內映象庫

不得不說世界上還是好人多,國內許多人為我們提供了方便使用的各種代理映象庫(以及捐款連結們),總之有條件的話還是可以捐一下

具體方法如下:修改~/.sbt/repositories(沒有的話自行建立),新增[repositories]標籤並在其下設定全域性映象即可,更多可參照

官方文件中的語法說明

簡單地說就是一些如下形式的字串,sbt會從上到下一個一個的進行查詢,name可以自己隨意設定,proxy-address是映象庫的地址

name: http://proxy-address

之後推薦幾個比較好用的映象庫,一個是oschina的,也就是百度出來最多的一種設定,整個配置檔案大致如下,,然而實測下來oschina的源並不好用,很多時候都會被他卡死:

[repositories]
local
osc: http://maven.oschina.net/content/groups/public/
typesafe: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly
sonatype-oss-releases
maven-central
sonatype-oss-snapshots

然而,我在本地測試的結果是oschina的庫仍然有許多問題,這裡推薦另一個映象庫,使用了他們自己的伺服器(github)進行搭建,核心思想repox幫助你從上游查詢,是若無法從上游拿到合適的jar包的話就儘快想辦法讓sbt fail掉,並且為廣大使用者提供了一個公服,掛載在了阿里雲上面,更新十分及時,具體介紹頁面在這裡

在配置檔案中較高優先順序的位置新增如下映象庫,並且去除掉所有其他的映象庫即可:

repox-maven: http://repox.gtan.com:8078/
repox-ivy: http://repox.gtan.com:8078/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext]

實際測試中使用gtan家的映象庫效果比oschina好許多,雖然仍然需要偶爾手動ctrl+c,但總體下載速度已經可以接受了。

結語

最終的解決辦法是使用了gtan的源和系統自帶的其他源們,掛上了代理,並且在出現fail時用瀏覽器開啟fail的地址之後fail的檔案下載下來,然後重新執行sbt,一般都會暢通,原理不是很確定,十分玄學,如有確定求告知,感謝。

不得不說雖然存在下載速度等問題,如同sbt,maven甚至apt這類的依賴管理工具真是大大的減輕了專案管理的負擔,推薦大家使用。特別是maven,下載時相較sbt要順暢許多。

最後,問候sbt和g**** ***l