sbt 1.0.4 hotfix とパフォーマンスまわりの修正

Lightbend の技術系ブログ Tech Hub blog に sbt 1.0.4 hotfix and the performance fixes という記事を書いたので、訳しました。

@eed3si9n) 著

皆さんこんにちは。アメリカに住んでいる人たちは、良い感謝祭 (Thanksgiving) の連休すごせたでしょうか。
遠くからの親戚や友達が集まって食事を作ったり、小咄を交わす年中行事という意味では、日本の正月休みに近いものがあると思う。

あと、sbt 1.0.4 をリリースしたこともアナウンスします。これは sbt 1.0.x シリーズの hotfix で、バグ修正にフォーカスを当てたバイナリ互換リリースだ。
sbt 1 は Semantic Versioning にもとづいてリリースされるので、プラグインは sbt 1.x シリーズ中機能することが期待されている。

パフォーマンスデグレの修正

感謝祭ということで、お世話になっている人たちの事を考えるわけだけど、僕は Scala のツーリングエコシステムにコントリビュートしてくれている皆さんに感謝している。これは、sbt へのコードのコントリビュートだけじゃなく、考えさせられるブログ (Haoyi さんの So, what's wrong with SBT? など)、トーク (Jeff さんの Beyond the Build Tool など)、ドキュメンテーション、IDE/エディタ統合、や代替ビルドツール (Chris さんの cbt など) も含めている。冷笑的に「sbt はダメ」って言って終わりにするんじゃなく、この人たちは腕をまくって、sbt そのものを直したり、代替案を考え出しているからだ。

sbt 1 に関連してパフォーマンスのデグレが報告されているが、何人もの人が飛び込んで取り組んでくれている。

  • Scala Center の Jorge さん (@jvican) は性能向上関係を色々やっていて、sbt 1.0.4 で使われている Zinc 1.0.5 ではクラスパス上の JAR のハッシュ計算のパフォーマンスが落ちた対策として、JAR ごとにキャッシュする修正を提供してくれた。
  • Sam Halliday さん (@fommil)‏ もクラスパスハッシュ問題に取り組んで、再現プロジェクトを提供したり、pull request を送ってくれた。
  • OlegYch さん (@OlegYch) は testQuick のパフォーマンスがデグレを修正してくれた。 #3680/#3720
  • Leonard Ehrenfried さん (@leonardehrenfried) もパフォーマンスのベンチマークに取り組んで、Sam さんの再現プロジェクトをもとに自動で実行して性能を比較するハーネスを作ってくれた。また、Ivy-log4j のパフォーマンスデグレを修正してくれた。 #3711/util#132
  • Lightbend Tooling team からは Dale (@dwijnand) がパフォーマンス関連の issue に取り組んだり、社内のエキスパートから知見を得たりしている。

以下は、Leonard / Sam の 25個のサブプロジェクトを使ったテストプロジェクトで no-op compile を行った sbt 1.0.4 のパフォーマンスだ:

注意: sbt セッションが立ち上がっていることを前提として、ベンチマークのコンパイル時間の結果からスタートアップ時間を差し引いた。

sbt 0.13.16 sbt 1.0.3 sbt 1.0.4
startup 28s 38s 34s
no-op compile* 27s 46s 22s
no-op compile x2* 37s 80s 33s

sbt 1.0.3 で no-op コンパイルのがデグレしたが、sbt 1.0.4 では 0.13.16 より 10 から 20% ぐらい速くなっていることが分かる。

Java 9 関連の修正

sbt 1.0.4 は、Java 9 で警告が出る Ivy 内でのリフレクションの使用を取り除いた。以前のバージョンでそれをやろうとして作り込んでしまったバグを吉田さん (@xuwei_k) が修正してくれた。これらが、launcher と library management モジュールに行き渡ったので、警告の数は減ると思う。

  • Java 9 上で実行した場合に Ivy で ArrayIndexOutOfBoundsException が発生する問題を修正した。 ivy#27 by @xuwei-k
  • launcher 1.0.2 アップグレードして Java 9 上での警告を減らした。 ivy#26/launcher#45 by @dwijnand
  • Java 9 上での -jvm-debug 処理を修正した。 launcher-package197 by @mkurz

Scala 2.13.0-M2 サポート

Adriaan (@adriaanm) は、Scala の 2.13.x ブランチで REPL まわりのコードの構造を改善している。これに対して sbt 側で対応する必要があるので、まだ 2.13 がマイルストーンのうちに対策した。
ブリッジとなるコードを sbt 1.0.3 を使って Scala 2.13.0-M2 でコンパイルして確認する必要があったが、sbt 1.0.3 が 2.13.0-M2 に対応していないという堂々巡り問題を対策する必要があった。

zinc#453 by @eed3si9n and @jan0sch

その他の修正

  • 値クラスの内部型が変更した時にアンダーコンパイルする問題を修正した。 zinc#444 by @smarter
  • run タスクのログレベルが debug になる問題を修正した。 #3655/#3717 by @cunei
  • Scala コンパイラの templateStats() がスレッドセーフじゃない問題を対策した。 #3743 by @cunei
  • "Attempting to overwrite" というエラーメッセージを修正した。 lm#174 by @dwijnand
  • eviction warning の内容が間違っているのを修正した。 lm#179 by @xuwei-k
  • プラグインとの相性を改善するために、Ivy のプロトコルを http:https: のみ登録するようにした。 lm183 by @tpunder
  • スクリプトで bc を採用したことで問題が出たので expr を使うようにした。 launcher-package#199 by @thatfulvioguy
  • Zinc の scripted テストを改善した。 zinc#440 by @jvican

参加

sbt や Zinc 1 を実際に使ったり、バグ報告、ドキュメンテーションの改善、ビルドの移植、プラグインの移植、pull request をレビューしたり送ってくれた皆さん、ありがとうございます。

sbt, zinc, librarymanagement, util, io, website などのモジュールで実行した git shortlog -sn --no-merges v1.0.3..v1.0.4 によると、sbt 1.0.4 は 17人のコントリビュータのお陰でできました (敬称略): Eugene Yokota, Kenji Yoshida (xuwei-k), Jorge Vicente Cantero (jvican), Dale Wijnand, Leonard Ehrenfried, Antonio Cunei, Brett Randall, Guillaume Martres, Arnout Engelen, Fulvio Valente, Jens Grassel, Matthias Kurz, OlegYch, Philippus Baalman, Sam Halliday, Tim Underwood, Tom Most. Thank you!

sbt を手伝ってみたいと興味があれば、好みによって色々な方法があります。

  • プラグインやライブラリを sbt 1 へと移行させる。
  • バグを見つけたら報告する。
  • バグの修正を送る。
  • ドキュメンテーションの更新。

他にもアイディアがあれば、sbt-contrib で声をかけてください。