最近Scala 2.12.18が出た。最新のJDKとかに対応したり、マイグレーション向けの機能が拡充されている。
そんで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とかの裏方として使われているやつだ。
でもどうしてこんなライブラリが依存関係に?
ScalafixはSemanticdbを使いがち
しばらく訝しがっていると、build.sbt
にScalafixに関連した設定が転がっているのを発見。
semanticdbEnabled := true,
semanticdbVersion := scalafixSemanticdb.revision,
上掲のような設定が書かれていた。Scalafixは、いくつかの機能のためにSemanticdbが必要なので、semanticdbがオンになっていたのだ。
おそらくScalaのコンパイラのバージョンを上げたことで微妙なセマンティック上の変化が起こり、SemanticDBが古びてしまったのだろう。しかしScalafixのバージョンが古くてScala 2.12.18に対応したSemanticdbが依存でやってこないのでコケているのだと直感した。
そこでScalafixのリリースページを見に行くと見事に新リリースが出ていた。
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とかセマンティックまわりを見ているプラグインがつっかえることがある