Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Scalaのバージョンを上げたがScalafixが古くてコンパイルしなかった事例

最近Scala 2.12.18が出た。最新のJDKとかに対応したり、マイグレーション向けの機能が拡充されている。

github.com

そんでScala 2.12.16をScala 2.12.18まで上げたら、手元ではコンパイルが通るけどCI(GitHub Actions)では通らなくなってしまった。ログを見ると、semanticdbが見付からない由。

#19 51.16 [error] (*** / update) sbt.librarymanagement.ResolveException: Error downloading org.scalameta:semanticdb-scalac_2.12.18:4.6.0
#19 51.16 [error]   Not found
#19 51.16 [error]   Not found
#19 51.16 [error]   not found: /root/.ivy2/localorg.scalameta/semanticdb-scalac_2.12.18/4.6.0/ivys/ivy.xml
#19 51.16 [error]   not found: https://repo1.maven.org/maven2/org/scalameta/semanticdb-scalac_2.12.18/4.6.0/semanticdb-scalac_2.12.18-4.6.0.pom

だいたいこういうときはそのライブラリのバージョンを上げればいいのだが、semanticdbなんて直接使った覚えはない。そもそもsemanticdbはScalaなどのシンボル情報を取出したりするためのデータモデルで、たぶんLSPとかの裏方として使われているやつだ。

scalameta.org

でもどうしてこんなライブラリが依存関係に?

ScalafixはSemanticdbを使いがち

しばらく訝しがっていると、build.sbtにScalafixに関連した設定が転がっているのを発見。

  semanticdbEnabled := true,
  semanticdbVersion := scalafixSemanticdb.revision,

上掲のような設定が書かれていた。Scalafixは、いくつかの機能のためにSemanticdbが必要なので、semanticdbがオンになっていたのだ。

おそらくScalaのコンパイラのバージョンを上げたことで微妙なセマンティック上の変化が起こり、SemanticDBが古びてしまったのだろう。しかしScalafixのバージョンが古くてScala 2.12.18に対応したSemanticdbが依存でやってこないのでコケているのだと直感した。

そこでScalafixのリリースページを見に行くと見事に新リリースが出ていた。

github.com

New: added support for the latest Scala versions (3.3.0, 2.13.11, 2.12.18)

ビンゴ!

そこでplugins.sbtを見てScalafixのバージョンをv0.11.0に上げてやる。するとピンピンしてコンパイルが通るようになった。

addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.11.0")

ここで一句

コンパイラのバージョンを上げるとたまにASTとかセマンティックまわりを見ているプラグインがつっかえることがある

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?