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

展开阅读全文

没有更多推荐了,返回首页