Skip to content

Instantly share code, notes, and snippets.

@gakuzzzz
Last active June 27, 2019 03:23
  • Star 40 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save gakuzzzz/49b78acfe1401fd8047c7a0f0d981cfa to your computer and use it in GitHub Desktop.
あなたの sbt update を爆速にする sbt-coursier の紹介

あなたの sbt update を爆速にする sbt-coursier の紹介

この記事は 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 ライフを体験してみてください。

@gakuzzzz
Copy link
Author

gakuzzzz commented Jan 5, 2017

ベンチマークを、との事だったので手元にあった少し大きめのプロジェクトで時間取ってみました。

sbt 0.13.13 使用

// sbt-coursier 無し ./.ivy2 空
> sbt update
...snip...
[success] Total time: 1238 s, completed 2017/01/05 9:50:26

// sbt-coursier 無し 前回の状態からそのまま続けて実行
> sbt update
...snip...
[success] Total time: 27 s, completed 2017/01/05 9:52:01

// sbt-coursier 有り ./.ivy2/ 空
> sbt update
...snip...
[success] Total time: 121 s, completed 2017/01/05 10:07:46

// sbt-coursier 有り 前回の状態からそのまま続けて実行
> sbt update
...snip...
[success] Total time: 13 s, completed 2017/01/05 10:09:43

2回目はどちらもキャッシュヒットしてダウンロードは無かった感じですが、sbt-coursier無しの標準だと全subprojectで Resolving jline#jline;2.12.1 が走って時間差が出た模様

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment