以下再現コード
build.sbt
val commonSettings = Def.settings( scalaVersion := "2.12.11" ) lazy val a1 = project .settings( commonSettings, libraryDependencies += "org.scala-lang.modules" %% "scala-collection-compat" % "2.0.0" ) lazy val a2 = project .settings( commonSettings, libraryDependencies += "org.scala-lang.modules" %% "scala-collection-compat" % "2.1.6" % "test" ) lazy val a3 = project .settings( commonSettings, ) .dependsOn( a1 % "compile->compile;test->test", a2 % "compile->compile;test->test", )
a3/A.scala
object A{ // https://github.com/scala/scala-library-compat/commit/c3c39c06ff835173 // expect compile error if version < 2.1.0 val x = scala.jdk.CollectionConverters }
sbt 1.2.8だと自分が想定していたとおり、コンパイルエラーになる。なぜコンパイルエラーになって欲しいか?というと
- a1のmainで2.0.0に依存している
- a2ではtestでのみ2.1.6に依存している
- a3は、それぞれ以下のような依存ということである
- mainではa1のmainとa2のmainに依存
- testではa1のtestとa2のtestに依存
- よってa3のmainは(a1経由で)2.0.0にのみ依存しており、a3のtestは(a2のtest経由で) 2.1.6で上書きされているはず
- a3/A.scalaはmainのコードであり、Scala 2.12版のscala-collection-compatにまだCollectionConvertersが追加されていない状態のはず
しかし、sbt 1.3.x(いくつか試した限り、1.3.0から1.3.12全部・・・?)では、コンパイルエラーにならない。 つまり、なぜかa2に % "test" で追加したら、a3のmainの依存のversionが上がる、という個人的には予想外の怖いことが起こる???
https://t.co/mOteOQ8RLD
— ∃ugene 🥙yokot∀ (@eed3si9n_ja) 2020年6月12日
僕も Coursier で一番の問題だと思っていて、他の人も直してってお願いして最近のリリースでは直ったらしいです。
別のデグレが出てアップグレード見送りになりましたが将来的には多分修正されます。