构建.sbt不适用于不同的Scala版本



Scala for Data Science书和配套的Github repo中学习Scala,这里我特别谈论的是第2章的构建文件,复制在下面(做了一些修改)以供参考。

name := "Logistic_regression"
organization := "My Organisation"
version := "0.1.0-SNAPSHOT"
scalaVersion := "2.11.7" // 3.2.2 does not work
libraryDependencies ++= Seq(
"org.scalanlp" %% "breeze" % "0.11.2",
"org.scalanlp" %% "breeze-natives" % "0.11.2",
"org.slf4j" % "slf4j-simple" % "1.7.5"
)

从python和c++到scala,不同的scala环境,依赖关系等工作的想法对我来说还不完全清楚,但是我可以把build.sbt想象成Dockerfile的一种形式,可以通过创建自己的沙箱来照顾对任何主机的依赖关系吗?

回购本身使用scalaVersion := "2.11.7"工作良好。但是我想把它匹配到我的系统scala版本(见下面的版本细节)。

della@dell-xps ~/s/l/s/chap02 (master)> scala --version
Scala code runner version 3.2.2 -- Copyright 2002-2023, LAMP/EPFL
della@dell-xps ~/s/l/s/chap02 (master)> sbt --version
sbt version in this project: 1.8.2
sbt script version: 1.8.2

但将其更改为3.2.2会导致以下堆栈跟踪(只是顶部部分)。

[warn]  Note: Unresolved dependencies path:
[error] sbt.librarymanagement.ResolveException: Error downloading org.scalanlp:breeze_3:0.11.2
[error]   Not found
[error]   Not found
[error]   not found: /home/della/.ivy2/localorg.scalanlp/breeze_3/0.11.2/ivys/ivy.xml
[error]   not found: https://repo1.maven.org/maven2/org/scalanlp/breeze_3/0.11.2/breeze_3-0.11.2.pom

那么为什么它是构建。SBT无法解决最新scala版本的依赖关系?或者,应该这样吗?

进一步,如果我想在同一个项目上工作与较新的scala版本,我应该做它没有sbt,并以某种方式安装依赖关系在系统级别,可用于所有项目?我怎么绕过它?

我能想到的构建。sbt作为Dockerfile的一种形式,可以通过创建自己的沙箱来照顾对任何主机的依赖关系?

这里没有Docker意义上的沙箱,您不是在创建一个孤立的环境(@SethTisue评论说,这可以被认为是沙箱,因为sbt管理依赖项本身,而不是依赖于系统范围内安装的依赖项)。这是使用构建工具,如Scala中的Sbt, Mill, Fury, Cbt, Java中的Maven或Gradle, Java/c++/Go中的Bazel, Python/Go/Java/Scala/Kotlin中的Pants, c++中的Make, Python中的Pip, Haskell中的Cabal或Stack等。

Scala 2和Scala 3完全不同

https://docs.scala-lang.org/scala3/reference/

http://dotty.epfl.ch/

Scala 3仍然是Scala的新版本。并不是所有的依赖项都是针对Scala 3发布的。并不是所有这些都可以很容易地迁移到Scala 3中(因为Scala 2的宏等)。

Scala 2.10, 2.11, 2.12, 2.13是二进制不兼容的。这就是为什么我们在Scala库中使用%%:"org.scalanlp" %% "breeze" % "0.11.2""org.scalanlp" % "breeze_2.11" % "0.11.2",而使用scalaVersion := "2.11.7"。但是有Scala 2.13 - Scala 3互操作

https://docs.scala-lang.org/scala3/guides/migration/compatibility-intro.html

有兼容模式CrossVersion.for3Use2_13/CrossVersion.for2_13Use3

https://docs.scala-lang.org/scala3/guides/migration/compatibility-classpath.html

如何在Scala 3中使用akka ?

您使用的依赖项的旧版本。如您所见,Breeze和Breeze原生版本0.11.2是为Scala 2.10、2.11发布的。它们是自Breeze 2.0以来为Scala 3发布的

https://mvnrepository.com/artifact/org.scalanlp/breeze

https://mvnrepository.com/artifact/org.scalanlp/breeze-natives

那么试试下面的build.sbt

scalaVersion := "3.2.2"
libraryDependencies ++= Seq(
"org.scalanlp" %% "breeze"         % "2.1.0",
"org.scalanlp" %% "breeze-natives" % "2.1.0",
"org.slf4j"    %  "slf4j-simple"   % "2.0.7"
)

For Breeze 1。没有Scala-3版本,但有Scala-2.13版本,所以你可以尝试兼容模式

scalaVersion := "3.2.2"
libraryDependencies ++= Seq(
"org.scalanlp" %% "breeze"         % "1.0" cross CrossVersion.for3Use2_13,
"org.scalanlp" %% "breeze-natives" % "1.0" cross CrossVersion.for3Use2_13,
"org.slf4j"    %  "slf4j-simple"   % "2.0.7"
)

但是在Breeze 1.0之前没有Scala-2.13版本,所以你只能使用Scala 2.10-2.12。

scalaVersion := "2.12.17"
libraryDependencies ++= Seq(
"org.scalanlp" %% "breeze"         % "0.13.2",
"org.scalanlp" %% "breeze-natives" % "0.13.2",
"org.slf4j"    %  "slf4j-simple"   % "2.0.7"
)

如果你使用sbt,很可能你不需要在你的系统中安装任何东西(除了sbt和Java)。Sbt将自己解析依赖项。

如果你在系统中安装了一些东西,很可能这与sbt构建无关。