【问题标题】:Why do SBT projects in IntelliJ IDEA break and require re-creation?为什么 IntelliJ IDEA 中的 SBT 项目会中断并需要重新创建?
【发布时间】:2019-03-16 02:15:35
【问题描述】:

在将 SBT 与 IntelliJ IDEA 结合使用时,项目通常会进入一个糟糕的状态,编译器错误会出现在不应出现的地方,而它们不会出现在终端中。

一个项目将在终端中sbt compile 没有问题,但在我删除.idea 目录并单击“从现有源创建新项目”之前,它将在 IntelliJ IDEA 中完全搞砸。

在 IntelliJ 中配置 SBT 项目以使用 SBT shell 根本没有帮助。

首先,为什么会发生这种情况?哪些因素会导致问题:

  1. SBT 中的错误
  2. IntelliJ IDEA 的核心或插件系统中的错误
  3. IntelliJ IDEA SBT 插件中的错误
  4. SBT 1.2 或更早版本的基本设计
  5. IntelliJ IDEA 或其插件系统的基本设计

最后,如何避免这种破损?

【问题讨论】:

    标签: intellij-idea sbt intellij-plugin sbt-idea intellij-idea-2018


    【解决方案1】:

    据我所知,Intellij IDEA 会创建自己的内存结构来表示已解析文件的实际状态,直至启用您从 IDE 获得的所有有用功能(参考、用法、文档、用于编译器错误,...)。

    这个模型不是 sbt 构建的输出。该插件允许 IDE 基于 sbt 构建文件创建这样的内存表示,并且最近使用 sbt 引擎本身(您需要在首选项中启用它)。

    仍然 sbt 不允许保留 IDE 可以使用的输出的内存表示,因此 IDEA 的代码“图片”有时会与真实的编译输出不同,可能是因为语言和插件中的一些高级特性(例如,宏倾向于这样做)在 IDEA 数据结构中没有正确表示。

    通常当您更改构建文件中的某些内容时,IDEA 会自动刷新构建状态,或提示您执行此操作(当构建文件编辑器处于焦点时)。这应该足以将构建与 IDE“对齐”。

    然而,在许多情况下,复杂的代码库会在 IDE 中永久显示错误的错误。

    正如我们所说,正在努力解决这种情况

    • 一个 Scala LSP implementation 正在制作中,它将与底层构建工具实际连接,为任何兼容的编辑器(任何 LSP 客户端)提供有用的信息
    • 作为 LSP 工作的补充,正在探索 BSP (build server protocol),其定义应允许不同的兼容构建工具(sbt、mill、cbt...)更好地与底层编译器和不同的编辑器集成

    您可以在Scala Blog Announcement找到更多信息

    【讨论】:

    • 感谢您的详细回复! LSP 实施和构建服务器协议 (BSP) 的进展情况如何?
    • 另外,你能评论一下我关于 CBT 的问题吗? stackoverflow.com/q/52571068/14193
    • @Neil 我没有足够的关于 CBT 的信息,我知道这个项目,但它似乎并没有流行起来。关于LSP(金属项目)的状态,它主要是由志愿者贡献者开发的,但就在上个月,它已从 scala-center 分配了一个稳定的资源。它仍然是一个 alpha 阶段的项目(vscode 扩展甚至不在市场上)。关于BSP我知道的更少,但我认为它还处于萌芽阶段
    • 感谢您的详细回复。是否有一种更简单、自动的方法可以让 IntelliJ 尝试以非破坏性方式重新创建项目?用户可以做些什么来避免这个问题?
    猜你喜欢
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多