おおくまねこ

職業プログラマーです。興味のある話題を書いています。

sbt1.4系からsbt1.5系に移行したいけどうまくいかなかったあなたへ

はじめに

Scala のビルドツール sbt のバージョンアップをするときに途方にくれていたのですが、

実は結構簡単にできる方法があると教えてもらったので、その時のことを記録しています。

 

特に 1.4 系から 1.5 系に移行するときに大幅な変更があり、その差分変更にてこずった話になります。

同じように 1.4 系から、もしくはそれ以前のバージョンから更新したい場合に参考になるのではと思っています。

 

sbt バージョンアップ

sbt はバージョンアップに伴って大幅な機能追加・機能変更がされています。

特に sbt 1.5 系から Scala3 のビルド機能が追加されるなど注目の変更もありました。

 

私もそれにつられて sbt 1.5 を使うようにしているのですが、

古いプロジェクトで sbt 1.4 をつかっていて、更新したときに build.sbt の変更が必要になりました。

具体的には build.sbt で使う in というメソッドが非推奨になっています。

どういう実装のものかというと、以下のような記述のケースです。

version in webpack := "4.43.0",
version in startWebpackDevServer := "3.11.0",
webpackConfigFile in fastOptJS := Some(baseDirectory.value / "webpack" / "webpack-fastopt.config.js"),
webpackConfigFile in fullOptJS := Some(baseDirectory.value / "webpack" / "webpack-opt.config.js"),
webpackConfigFile in Test := Some(baseDirectory.value / "webpack" / "webpack-core.config.js")

 

この記法の代わりにスラッシュ構文という / を使う必要があるそうです。

設定箇所が複数あると、ひとつずつ変えていくのも大変ですし、どうしようかなと悩んでいたらTwitterで「scalafix を使ってマイグレーションができる」という方法を教えてもらえました。

 

scalafix は設定方法に従って Scala や sbt のファイルを書き換えてくれる機能です。

sbt プラグインとして使うことが多い印象でしたが、コマンドラインとして実行する方法もあるようです。

 

sbt 1.4 から sbt 1.5 へ、scalafix を使って移行する方法については以下のブログが詳細に書かれていました。

eed3si9n.com

 

以上のブログで十分かもしれませんが、もう少し補足させてもらいます。

やることとしては以下

  • (入っていない場合は)cs コマンドを入れる*1
  • scalafix をインストールする
  • scalafix をコマンドへ実行パスを通す
  • 前述したブログの内容のコマンドを実行します。

cs コマンドのインストール方法については以下を参考にしてください*2

get-coursier.io

 

cs コマンドを使って、scalafix をインストールします。

cs コマンドからインストールすると、Coursier のホームディレクトリ以下にインストールされてしまうので、コマンドラインから実行できるように実行PATHを設定します*3

 

コマンドが通るようになったら、以下のコマンドを、sbt を更新したいプロジェクトのなかで実行します。

>scalafix --rules=https://gist.githubusercontent.com/eed3si9n/57e83f5330592d968ce49f0d5030d4d5/raw/7f576f16a90e432baa49911c9a66204c354947bb/Sbt0_13BuildSyntax.scala *.sbt project/*.scala

 

以上のコマンドを実行した結果、以下のように書き換えが行われました。

sbt 1.5 を起動すると、エラーや Warning が出力されなくなり、無事に移行することができました。

(webpack / version) := "4.43.0",
(startWebpackDevServer / version) := "3.11.0",
(fastOptJS / webpackConfigFile) := Some(baseDirectory.value / "webpack" / "webpack-fastopt.config.js"),
(fullOptJS / webpackConfigFile) := Some(baseDirectory.value / "webpack" / "webpack-opt.config.js"),

 

さいごに

Scala は大幅な変更がたびたび入る言語ですが、移行の大変さを軽減するためのツールや仕組みが充実していると感じています。

私の周り*4には「Scalaはメンテが大変だ」「Scala3もリリースされて移行を考えると採用しづらい」という意見を聞くこともあります。

確かに自分もそういう風に感じることがありますが、Scalaでの開発大変は他では得難いことも多くあると感じているので、そこであきらめる人やチームを減ってほしいなと思っています。

こういうツールがある、こういう対応方法が用意されている、ということを多くの人が知ってほしいと思っています。

参考

*1:Coursier というツールの略です。scalafix をインストールするために必要です

*2:Windows/Mac/Linux すべてに対応しています

*3:実行PATHの設定方法は各OSでの設定方法を参考にしてください。

*4:主観かもしれません。職場の別チームや勉強会でそういう意見を聞くなという印象をもっています。