Learning Scala 参考了Scala for Data Science这本书和配套的Github repo,这里我特别说一下第2章的build文件,复制如下(稍作修改)以供参考。
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 的一种形式,它可以处理通过创建自己的沙箱来消除对任何主机的依赖?
repo 本身使用
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
那么为什么 build.sbt 无法解决更新的 scala 版本的依赖关系?或者,应该吗?
此外,如果我想使用较新的 scala 版本处理同一个项目,我是否应该在没有 sbt 的情况下进行,并以某种方式在系统级别安装对所有项目可用的依赖项?我该如何绕过它?
我能否将 build.sbt 视为 Dockerfile 的一种形式,它可以通过创建自己的沙箱来处理任何主机上的依赖关系?
这里没有沙盒,你不是在创建一个孤立的环境。这是使用构建工具,如 C++ 中的 Make、Python 中的 Pip、Java 中的 Maven 或 Gradle、Haskell 中的 Cabal 或 Stack 等。
Scala 2 和 Scala 3 完全不同
https://docs.scala-lang.org/scala3/reference/
Scala 3 仍然是相当新的 Scala 版本。
并非所有依赖项都针对 Scala 3 发布。并非所有依赖项都可以轻松迁移到 Scala 3(因为 Scala 2 宏等)。
Scala 2.10、2.11、2.12、2.13 是二进制不兼容的。但是有 Scala 2.13 - Scala 3 interop
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
您使用的依赖项的版本很旧。如您所见,Breeze 和 Breeze-natives 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"
)
Breeze 1.x没有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 构建无关。