【问题标题】:Making sense of Scala development tools理解 Scala 开发工具
【发布时间】:2020-07-24 02:41:38
【问题描述】:

生态系统中有无数的开发工具和术语,例如语言服务器、构建服务器、Metals、BSP、LSP、Bloop、Zinc、Coursier、增量编译器、演示编译器等。

我想知道是否有人可以演示它们如何组合在一起并简要解释关系和差异。具体来说,我希望有一个图表并按照Making sense of Scala FP Libraries 的方式回答。例如,这是我的尝试

(Concept)                       (Example implementation)
--------------------------------------------------------------------
IDE                             Visual Studio Code
 |                               |
Scala IDE plugin                Metals Visual Studio Extension
 |                               |
Language Server Protocol        Microsoft LSP
 |                               |
Scala language server           Metals
 |                               |
Build Server Protocol           BSP from JetBrains and Scala Center
 |                               |
Scala build server              Bloop
 |                               |
Build tool                      sbt
 |                               |
Dependency resolution           Coursier
 |                               |
Incremental compiler            Zinc
 |                               |
Presentation compiler           parser and typer phases of scalac
 |                               |
Bytecode generation             remaining compiler phases

【问题讨论】:

  • 实际目标是什么?还是只是好奇?我用 Grade 构建它,用 IntelliJ + scala 插件编辑它。还不需要太在意其他任何事情。
  • @bobah 试图了解组成元素如何组合在一起。

标签: scala development-environment build-tools incremental-build scala-metals


【解决方案1】:

像 Intellij 或(曾经)Scala IDE 这样的 IDE 旨在用于“智能”开发,其中编辑器会告诉您代码是否正确、建议修复、自动生成一些代码、提供代码导航、重构 - 换句话说,许多功能超越了简单的文本版本,可能只有语法高亮。

Intellij 有一个 Scala 扩展,它利用了他们自己重新实现的 Scala 编译器——即使部分代码被破坏,他们也需要它来更好地进行部分编译和智能感知工作。从其他构建工具(例如 sbt 或 bloop)导入构建定义,然后 Intellij 不会回复任何外部内容(除非您使用“使用 sbt 构建”之类的选项)。

Scala IDE 依赖于 Scala 演示编译器来实现智能感知。正如您在 scala-ide.org 上看到的那样:

Eclipse 的 Scala IDE 使用 Scala Presentation Compiler,这是 Scala 编译器的更快异步版本。表示编译器只运行直到并包括类型器阶段的阶段,即 27 个 scala 编译阶段中的前 4 个阶段。 IDE 使用演示编译器提供语义功能,例如实时错误标记、推断类型悬停和语义突出显示。本文档描述了您需要了解的关键类,以便了解 Scala IDE 如何使用演示编译器,并提供了 IDE 和演示编译器之间交互的一些示例。

所有其他编辑器/IDE 都旨在使用语言服务器协议 - LSP 是 Microsoft 的发明,目的是标准化一种在不同编辑器中支持语言的方式(尽管他们发明它是为了 VS Code),这将允许他们提供IDE 功能。金属(来自 ScalaMeta L语言 Server) 是 Scala 的 LSP 实现。如您所见here

代码完成、点类型和参数提示是使用 Scala 演示编译器实现的,该编译器由 Lightbend 的 Scala 编译器团队维护。

您可以使用 Scala Metals 扩展将其添加到 VS Code。

sbt、gradle、mill、fury、cbt 等是构建工具,它们使用 ivy2 或 coursier 之类的东西来解决和下载依赖项,然后使用 Zinc 增量编译器来提供以增量方式(重新)构建事物的能力编译器。构建工具可以运行测试、生成工件并将它们部署到存储库。

bloop 是一个解决问题的解决方案,即如果 JVM 很热,编译速度很快,并且每次你杀死你的构建工具/IDE 时 JVM 都会变冷。出于这个原因,您使用 nailgun 来保持一些 JVM 温暖,在后台运行构建任务。 bloop 本身无法生成配置,通常它应该由其他构建工具生成以加快开发过程中的编译速度。用于与后台运行的 bloop 服务器通信的协议是构建服务器协议 (bsp)。

Coursier 虽然主要用于依赖解析,但也可以用于install scala programs。您可以安装的一些值得注意的程序是:

  • scalafmt - Scala 格式化程序
  • ammonite - scala 的替代 REPL,它提供了很多不错的功能
  • scalafix - 用于提供自动代码迁移的代码重写工具

我放弃了在表格中描述事物,因为它会更好地显示在图表上,但由于 SO 不支持这种视觉效果,我只是求助于纯文本。

【讨论】:

  • 很好的答案:我只是在他们的 OSS 存储库中的任何地方都找不到 IntelliJ 演示编译器的源代码。我怀疑它现在已经过时了
猜你喜欢
  • 1970-01-01
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2012-12-09
  • 2012-02-23
  • 1970-01-01
相关资源
最近更新 更多