运行 intellij 中的 scala 只有 sbt,优缺点?

Running scala in intellij with only sbt, pros and cons?

我开始使用 scala,我在设置方面遇到了一些困难,因为大多数指南都有点过时了。

但是,我只是 运行 我的第一个 hello world,一切正常。目前我还没有下载 scala,只有 sbt- 构建工具。 我想知道为什么我能够 运行 我的 scala 代码,而无需下载 scala 本身? 我应该长时间安装 scala 运行,还是像现在这样安装 sbt 就足够了?

Im wondering why am i able to run my scala code, without having downloaded scala itself?

sbt 默认 automatically 解析必要的 Scala 依赖项,例如 scala-libraryscala-compiler 等,我们无需在 libraryDependencies 下显式指定它们。执行 show scalaInstance 应该输出 Scala 依赖项的目录,例如在我的机器上它输出类似

/Users/mario_galic/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.2/scala-library-2.13.2.jar
/Users/mario_galic/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.2/scala-compiler-2.13.2.jar
/Users/mario_galic/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.13.2/scala-reflect-2.13.2.jar
/Users/mario_galic/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/org/jline/jline/3.14.1/jline-3.14.1.jar
/Users/mario_galic/Library/Caches/Coursier/v1/https/repo1.maven.org/maven2/net/java/dev/jna/jna/5.3.1/jna-5.3.1.jar

因此开箱即用,如果我们执行 show Compile / libraryDependencies 那么 scala-library 应该已经列出

sbt:hello> show Compile / libraryDependencies
[info]  List(org.scala-lang:scala-library:2.13.2)

Should i install scala in the long run

请注意,系统范围内的 Scala 安装与 sbt 管理的 Scala 安装是分开的。我个人确实认为在系统范围内进行安装也很有用。例如,有时我想快速启动 Scala REPL 进行实验,而不必创建一个完整的项目。 dwijnand/scala-runners is a great way to run Scala outside sbt project. Say we want play with draft Scala features such as Improve REPL result printing for String and Product [ci: last-only] #8885,那我们直接执行

➜ scala --scala-pr 8885
https://repo1.maven.org/maven2/io/get-coursier/apps/maven-metadata.xml
  No new update since 2020-07-12 21:39:52
Welcome to Scala 2.13.3-20200608-225728-521a32a (OpenJDK 64-Bit Server VM, Java 1.8.0_252).
Type in expressions for evaluation. Or try :help.

scala> case class User(name: String, age: Int)
class User

scala> User("Picard", 70)
val res0: User = User(name = "Picard", age = 70)