この記事は Scala Advent Calendar 2016(Adventar) 10日目の記事です。
今は 12/10 の 625時です。年明けなんて無かった。いいね?
さてさて、sbt の依存jarのダウンロードが遅い、というのは割とよく言われる事であります。
で、この原因の一旦に、sbtが Apache Ivy を使っている、という点があります。
現状 Ivy は依存jarをダウンロードする際、全て直列でダウンロードします。依存グラフ的に関係のないライブラリがあっても、一つが終わらない限り別のjarをダウンロードしようとはしません。
ファイルIOもネットワーク通信も多重化できるこの時代にこれはいけません。
そこで Coursier の紹介です。
Coursier は Scala で書かれた、依存性解決用ライブラリです。
Readme には以下のように書かれています。
- downloading of artifacts in parallel,
- better offline mode - one can safely work with snapshot dependencies if these are in cache (SBT tends to try and fail if it cannot check for updates),
- non obfuscated cache (cache structure just mimics the URL it caches),
- no global lock (no "Waiting for ~/.ivy2/.sbt.ivy.lock to be available").
素晴らしいですね。
で、sbt で coursier を使えるように sbt-coursier という sbt plugin も提供されています。
というわけで、あなたの project/plugins.sbt
に以下の記述を追加してみましょう。
addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.0.0-M15")
たったこれだけで sbt update
が爆速になります。やったね。
手元のいくつかのプロジェクトで試してみたところ、小さい Play2 のプロジェクトでは、アプリケーションの依存性解決よりも、Play2 の sbt plugin の依存性解決の方が支配的でした。
なので project/plugins.sbt
だけでなく、project/project/plugins.sbt
にも上記の sbt plugin の指定をすることで、Play2 sbt plugin の解決も速くなります。
という訳で sbt-coursier で快適な sbt ライフを体験してみてください。
ベンチマークを、との事だったので手元にあった少し大きめのプロジェクトで時間取ってみました。
sbt 0.13.13 使用
2回目はどちらもキャッシュヒットしてダウンロードは無かった感じですが、sbt-coursier無しの標準だと全subprojectで
Resolving jline#jline;2.12.1
が走って時間差が出た模様