build.sbt 不适用于不同的 Scala 版本

问题描述 投票:0回答:1

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 的情况下进行,并以某种方式在系统级别安装对所有项目可用的依赖项?我该如何绕过它?

scala jar sbt environment
1个回答
0
投票

我能否将 build.sbt 视为 Dockerfile 的一种形式,它可以通过创建自己的沙箱来处理任何主机上的依赖关系?

这里没有沙盒,你不是在创建一个孤立的环境。这是使用构建工具,如 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 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

如何在 Scala 3 中使用 akka?

您使用的依赖项的版本很旧。如您所见,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 构建无关。

© www.soinside.com 2019 - 2024. All rights reserved.