sbt不适用于不同的Scala版本

64jmpszr  于 2023-04-06  发布在  Scala
关注(0)|答案(1)|浏览(213)

Scala for Data Science 这本书和配套的Github repo学习Scala,这里我特别谈论build file for Chapter 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形式,它可以通过创建自己的沙箱来处理任何主机上的依赖关系吗?
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,而是在系统级安装依赖项,对所有项目都可用?我该如何解决?

1hdlvixo

1hdlvixo1#

我可以把build.sbt看作是Dockerfile的一种形式,它可以通过创建自己的沙箱来处理对任何主机的依赖关系吗?
这里没有Docker意义上的沙盒,你没有创建一个隔离的环境 (@SethTisue评论说,这可以被认为是沙盒,因为sbt管理依赖本身,而不是依赖于系统范围内安装的依赖)。这是使用构建工具,如C++中的Make,Python中的Pip,Java中的Maven或Gradle,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库:使用scalaVersion := "2.11.7"时,"org.scalanlp" %% "breeze" % "0.11.2""org.scalanlp" % "breeze_2.11" % "0.11.2"。但有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
How to use akka in Scala 3?
您使用的依赖项的版本非常老。如您所见,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"
)

但是在Breeze1.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构建无关。

相关问题