Slide 1

Slide 1 text

2 Scala わいわい勉強会 6 2025-11-27 1 / 57

Slide 2

Slide 2 text

X( 旧twitter) @xuwei_k GitHub @xuwei-k blog https://xuwei-k.hatenablog.com sbt のコミッターでもある おそらく2009 年くらいからScala やってる 2 / 57

Slide 3

Slide 3 text

sbt 公式ドキュメント まだ随時更新中でそこまで完璧ではない(?) sbt 2 変更一覧 1 から2 へのマイグレーション方法 3 / 57

Slide 4

Slide 4 text

Scala Days 2025 での @eed3si9n さんの発表スライド Skip to next slide You can skip to the next slide in 3 Ad Skip to next slide You can skip to the next slide in 3 Ad Skip to next slide You can skip to the next slide in 3 Ad Skip to next slide You can skip to the next slide in 3 Ad 4 / 57

Slide 5

Slide 5 text

Scala Days 2025 での @eed3si9n さんの発表 https://www.youtube.com/watch? v=GM2ywMb4z7A 5 / 57

Slide 6

Slide 6 text

最近の自分の貢献 2024 年に書いたblog これ書いてから、同じような種類の貢献おそらく数 倍やってる 今日もpull req とbug 報告してた 6 / 57

Slide 7

Slide 7 text

sbt とは https://github.com/sbt/sbt https://www.scala-sbt.org/ Scala 界隈で大昔からあるbuild tool 7 / 57

Slide 8

Slide 8 text

sbt とは 2025 年11 月現在、2 系の安定版のリリースはまだ 1 系が主流 8 / 57

Slide 9

Slide 9 text

sbt とは それなりにデファクトスタンダード 使っているScala のライブラリのGitHub 見にいくと、体感8 〜9 割sbt でbuild されてる eed3si9n さんの発表資料にもあるが、2023 や2024 年の調査でも 大体そのくらい "Scala CLI" や Mill などの他のツールもある https://scala-cli.virtuslab.org/ https://mill-build.org/mill/index.html 9 / 57

Slide 10

Slide 10 text

sbt の開発 https://github.com/sbt/sbt/graphs/contributo @eed3si9n さんがずっと主要開発者 アメリカ住んでる日本人の方 最初の原作者は別の人 もう関わってない 10 / 57

Slide 11

Slide 11 text

sbt の開発 その他scalacenter の人など 自分はおそらく全体の総合コミット数だと10 位には 入ってる 直近頑張った期間に絞ると2 〜3 位になる そもそもrepository 複数あって正確な集計難しい 11 / 57

Slide 12

Slide 12 text

歴史 2009 年8 月 GitHub で辿れる最初のコミット? 途中省略 2011 年6 月 0.10.0 リリース 2011 年9 月 0.11.0 リリース 2012 年8 月 0.12.0 リリース 2013 年8 月 0.13.0 リリース 2017 年8 月 1.0.0 リリース 2025 年11 月の2 系の最新は2.0.0-RC7 12 / 57

Slide 13

Slide 13 text

実は最初は2008 年では? https://code.google.com/archive/p/simple- build-tool/source/default/commits?page=14

Slide 14

Slide 14 text

1.x の間は大体互換を保っている 1.0.0 が2017 年8 月 今は2025 年11 月 14 / 57

Slide 15

Slide 15 text

1.0.0 のリリースから 8 年以上経過!? 15 / 57

Slide 16

Slide 16 text

重要な前提知識 sbt 自体は大半のライブラリと異なり複数のscala version でcross build されていない sbt 1 はScala 2.12 言い換えるとsbt 1 のbuild ファイルはScala 2.13 や3 で書けな い 16 / 57

Slide 17

Slide 17 text

重要な前提知識 あくまでsbt 自体やplugin を作る時のversion で あって、sbt 1 自体はScala 3 や2.13 のbuild が可 能 初心者にとってややこしいポイント sbt 2 がずっとリリースされないからScala 2.12 のメンテがずっと続けられてる側面がある? 17 / 57

Slide 18

Slide 18 text

sbt 2 の主な変更点 Scala 2.12 から3 plugin をbuild し直さないと互換ない test のtask の変更 デフォルトでtask がcache される task のcache のための変更 common settings などの新機能 18 / 57

Slide 19

Slide 19 text

Scala 2.12 から3 おそらく一番重要な変更の1 つ 基本的にbuild ファイルを全てScala 3 で書く必要 がある build ファイルとは " なんとか.sbt" と "project/ なんとか.scala" の全部 新機能でワイワイする前に、これとplugin の件含 めて頑張って移行しないといけない 19 / 57

Slide 20

Slide 20 text

plugin をbuild し直さないと 互換ない 1.0.0 が出た2017 年8 月頃にpublish され、その後 8 年以上放置されたplugin でも、今も使えていた場 合があった メンテされてないsbt plugin に依存してないか? sbt 2 向けにpublish されてるか?されそうか?を チェック 20 / 57

Slide 21

Slide 21 text

sbt 2 のplugin https://www.scala- sbt.org/2.x/docs/en/community- plugins.html https://github.com/sbt/sbt/wiki/sbt- 2.x-plugin-migration 21 / 57

Slide 22

Slide 22 text

sbt 2 のplugin 発表時点の2025 年11 月末でpublish されてるもの が60 個くらい https://github.com/xuwei-k/sbt-2- plugins/blob/main/project/plugins.sbt xuwei-k が勝手に集めてる 22 / 57

Slide 23

Slide 23 text

2025 年11 月現在で 未対応なpluign 例 頑張ってる、あるいはpull req 出てるのでそのうち対 応されそう playframework 本体はまだだけど、関連plugin は既に対応済なもの多数 mima sbt-javaagent 23 / 57

Slide 24

Slide 24 text

まだあまり進んでない? scala-js scala-native scalapb 関連 sbt-updates 個人的にpull req 出してるが反応遅い 24 / 57

Slide 25

Slide 25 text

test のtask の変更 test はtestQuick のalias になりました! 25 / 57

Slide 26

Slide 26 text

testQuick とは? sbt 1 以前から存在 前回失敗したか、新しく追加や変更してまだtest し てないものだけ実行 前回成功し、かつ変更されてないものはskip 26 / 57

Slide 27

Slide 27 text

test のtask の変更 今まで通り必ず全部実行するにはtest ではなく testFull sbt 1 ではUnit だったのが値を返すようになった テスト結果を使って何かする独自task 作るときに便利? 27 / 57

Slide 28

Slide 28 text

test のcache test 結果もcompile 結果と同様にremote cache 可能になった gRPC 対応、Bazel 互換 test 結果というか、testQuick で実行するか判断するための情 報、のcache もちろんremote cache で共有するには追加の設定 が必要 remote ではなく同じマシン上で複数同じproject をgit checkout しても共有される可能性 28 / 57

Slide 29

Slide 29 text

test のcache うまく設定すればCI で影響あるtest だけ実行にな ってCI 時間短縮??? どの程度うまくいくのかは未知 雑にやるなら "HOME/.cache/sbt" を保存するだ けでもいけるが、それはアリなのか良くわかってな い このpath はLinux の場合でOS 毎に異なる 29 / 57

Slide 30

Slide 30 text

task のcache 任意のtask がデフォルトでcache される cache されていいのか?はtask 定義側の人間が考え る必要がある 言い換えるとtask 定義に副作用があるか? cache されたくない場合の記述方法が複数あり 30 / 57

Slide 31

Slide 31 text

任意のtask がデフォルトで cache される 結構攻めた変更だと思うので、慣れるまで、sbt 自 体やplugin が安定するまで、cache 関連の問題に遭 遇する可能性高い? cache をclear する方法やcache 使わないで実行す る最低限の方法を把握しておく必要 31 / 57

Slide 32

Slide 32 text

cache されたくない 場合の記述方法 project/plugins.sbt にscalacOptions 指定で 一括無効化 taskKey 定義時にアノテーション アノテーションも複数ある task の定義時に "Def.uncached" で囲う 32 / 57

Slide 33

Slide 33 text

task のcache のための変更 java.io.File の型がVirtualFile, VirtualFileRef, HashedVirtualFileRef な どになってる場合がよくある それらを使ってる場合は非互換変更 task 定義時にtype class のinstance 要求される 場合がある 33 / 57

Slide 34

Slide 34 text

VirtualFile 関連 sbt 1 から存在していたがsbt 2 で使われる箇所が 増えた fileConverter でjava.nio.file.Path と相互 変換可能 sbt.Keys 内部のfileConverter 定義 FileConverter の型定義 34 / 57

Slide 35

Slide 35 text

clean タスクで全てが clean されなくなる!? デフォルトでproject 毎のtarget 以外の場所に cache されるため Mac なら $HOME/Library/Caches/sbt Linux なら $HOME/.cache/sbt それ含めて全部をclean したい場合はcleanFull つい数日前に実装された 35 / 57

Slide 36

Slide 36 text

commons settings multi project の場合のみ関係ある話 project 2 つ以上、ということ top level に設定を書いた場合の挙動が変わる build file 自体のcompile error にはならない ので注意 36 / 57

Slide 37

Slide 37 text

commons settings top level に設定を書いた場合 sbt 1 まで: root に対する設定 sbt 2 から: 全てのsub project に読み込まれる 設定 37 / 57

Slide 38

Slide 38 text

sbtn がデフォルトに Graal で作られていてJVM より起動がはやい scala-native ではない JVM のclient というか今までのlauncher のjar も 引き続き提供される sbt 自体が全部Graal になるのではなくclient 詳細割愛するがsbt にはserver とclient という概念がある 38 / 57

Slide 39

Slide 39 text

sbtn がデフォルトに sbt 1 の時代から存在はしている 使われるかどうか?はある意味インストール方法や 起動方法によるが 引数の渡し方に微妙に制約があるので注意 39 / 57

Slide 40

Slide 40 text

ivy での依存解決機能が完全に 消えてcoursier のみに 結構前から既にデフォルトでcoursier だった sbt 1 の途中 なぜかivy 自体の依存はsbt 自体に少し残ってるが ivy の方が遅いなど色々微妙で、あえてivy 使ってる 人ほぼいないはずで影響少ないはず 40 / 57

Slide 41

Slide 41 text

その他色々な変更や非互換 target ディレクトリの場所の変更 成果物の場所が変わるので、jar などを生成した後にsbt 以外から 処理してる場合変更が必要 IntegrationTest 削除 古いスラッシュの記法削除 41 / 57

Slide 42

Slide 42 text

projectmatrix plugin 外部のplugin だったが組み込みになった https://github.com/sbt/sbt- projectmatrix scala version 毎にsub project ほぼ自動で作る 42 / 57

Slide 43

Slide 43 text

projectmatrix plugin "++ 3.x" などで切り替え不要になってcompile 並列可能などのメリット これを使わないといけないわけではない これを使わない今までの定義も普通に使える 一部機能足りてなくて困ってるので実装されてく れ〜 43 / 57

Slide 44

Slide 44 text

その他色々な変更や非互換 js やnative の %%% は %% で済むらしい? まだjs やnative のplugin がリリースされてなくて実質試せない が build ファイル変更した時のデフォルトの挙動が reload になる sbt query という新機能 44 / 57

Slide 45

Slide 45 text

いつRC ではない 2.0.0 が出るの? わかりません 主要開発者のeed3si9n さん次第? 数ヶ月以内?( 適当根拠無し予想) もうRC なので数年かかることはないはず 45 / 57

Slide 46

Slide 46 text

いつRC ではない 2.0.0 が出るの? ある程度bug が直ったら? まだいくつかbug ある 46 / 57

Slide 47

Slide 47 text

まだあるbug の例 https://github.com/sbt/sbt/issues/7722 https://github.com/sbt/sbt/issues/8340 https://github.com/sbt/sbt/issues/8335 https://github.com/sbt/sbt/issues/8334 自分が報告した and 相対的に多少重要?と思ったも の雑に列挙したが、他にもある 47 / 57

Slide 48

Slide 48 text

sbt 自体のbuild に使う Scala 3 のversion とJDK 今のところScala 3.7.x 最新 Scala 3.7 までJDK 8 サポートされてる 48 / 57

Slide 49

Slide 49 text

sbt 自体のbuild に使う Scala 3 のversion とJDK lazy val 実装でsun.misc.Unsafe 使っててJDK 25 以降警告出る Scala 3.0 から3.7 Scala 2 はlazy val 実装にはUnsafe 使ってない sbt は一旦無理やり抑制する引数渡すようにしたっぽいが JDK 25 での警告は他にも JEP472 unix domain socket 使うためのコード部分 49 / 57

Slide 50

Slide 50 text

sbt 自体のbuild に使う Scala 3 のversion とJDK もうすぐScala 3.8 出るが? いま3.8.0-RC2 Scala 3.8 はJDK 17 以上必須になる予定 50 / 57

Slide 51

Slide 51 text

Scala 公式の発表↓ JDK 17 will be the next minimum version required by Scala 3 51 / 57

Slide 52

Slide 52 text

52 / 57

Slide 53

Slide 53 text

RC と今後の互換 sbt 2 のRC 使ってpublish したplugin はRC ではな いsbt 2 でも互換を保つ予定 bug 修正したり新機能は入るが、もう大幅な互換壊 す変更は入らないはず 53 / 57

Slide 54

Slide 54 text

RC と今後の互換 本格的な重要なproject のbuild 自体をsbt 2 に切り 替えるのは明らかにはやいが、plugin のbuild 含めて 色々試してもほぼ無駄にならないはず? 54 / 57

Slide 55

Slide 55 text

sbt 2 のリリースのために 個人的に頑張る活動 だいぶsbt 本体にpull req した 結構試して結構bug 報告もした 手当たり次第に(?)sbt plugin の2 対応やってる scala-steward の対応 55 / 57

Slide 56

Slide 56 text

sbt 2 を試して貢献しよう 少しでもいいから気が向いたら試してくれ〜 何かあればScala ワイワイのDiscord やTwitter な どで聞いてくれれば可能な範囲でこたえます 56 / 57

Slide 57

Slide 57 text

おわり 57 / 57