わすれっぽいきみえ

みらいのじぶんにやさしくしてやる

sbtそのものがビルドされたときのscalaのバージョンと実行環境としてのscalaのバージョンは異なるという話

完璧に勘違いしていた。

cat build.sbt
// build.sbt
scalaVersion := "2.11.8"

scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked", "-Xlint")

みたいな雑なbuild.sbtをおいたディレクトリで sbt about を実行してみると

$ sbt about
[info] Set current project to scala (in build file:/Users/kimikimi714/Documents/scala/)
[info] Updating {file:/Users/kimikimi714/Documents/scala/}scala...
Waiting for lock on /Users/kimikimi714/.ivy2/.sbt.ivy.lock to be available...
[info] Resolving jline#jline;2.12.1 ...
[info] Done updating.
[info] This is sbt 0.13.12
[info] The current project is {file:/Users/kimikimi714/Documents/scala/}scala 0.1-SNAPSHOT
[info] The current project is built against Scala 2.11.8
[info] Available Plugins: sbt.plugins.IvyPlugin, sbt.plugins.JvmPlugin, sbt.plugins.CorePlugin, sbt.plugins.JUnitXmlReportPlugin
[info] sbt, sbt plugins, and build definitions are using Scala 2.10.6

Scala 2.10.6<

もちろん「The current project is built against Scala 2.11.8」も確認してはいるがどういうこっちゃ。
mac本体に入ってるscalaのバージョンを確認すると

$ scala -version
Scala code runner version 2.11.8 -- Copyright 2002-2016, LAMP/EPFL

となっていた。

なんでsbtで使ってるscalaとプロジェクトビルド時のscalaのバージョンが違うんだ、なんか私自身が勘違いしていそうだなぁと思ったので公式サイトを見に行ったところ以下の記事で理解した。

sbt Reference Manual — Configuring Scala

『sbt’s Scala version』という項目を見るとわかるのだが、例えば「sbt 0.13.12はScala 2.10.6でビルドされたものだ」と明記されている。
sbtが実行される前に必要なバージョンと記載されていて、「いやscala 2.11.8ではない理由にはなってなくないか…。2.10.6が最低でも必要ですって話なら理解できる」とちょっと思うところあるけど、sbtがビルドされたのが2.10.6でも、プロジェクトをビルドするときのscalaのバージョン指定をそれより上にしても問題ないということが分かった。つまり常に一致するわけではない。

まぁ別にscala 2.11でないと使えないような構文なり何なりがsbtそのもののプロジェクトに使われてないならscalaのプロジェクトとsbtビルド時のscalaのバージョンが一致しなくても、問題はそう起こらないかと一人でなんとなく納得した。