【问题标题】:scala sbt compilation horror due to slowness and various issues由于速度慢和各种问题,scala sbt 编译恐怖
【发布时间】:2016-03-04 08:51:28
【问题描述】:

我在 scala 中使用 sbt 进行编码的时间非常糟糕。 我知道 scala 中的编译与 java 相比本来就很慢。

我已经尝试过 eclipse 和 intellij,在 scala + sbt 中进行开发,而且都知道 IDE 很糟糕。请指导我解决我面临的以下恐惧:

  1. 如何在 scala 中将编译时间减少到毫秒(就像对于 java 一样),即使对于大型项目......在 IDE(eclipse/intellij)中......鉴于我正在使用 sbt

  2. 如何确保 IDE 中的构建以增量方式工作并且仅在更改的文件上工作。我观察到在文件的每次代码更改/保存时,IDE 中都会发生完整的构建.....再次记住我正在使用 sbt

  3. 请对命令行提出相同的建议,在每次代码更改后,当我执行 sbt 打包时,似乎 sbt 重新编译了整个项目而不是更改的文件。

  4. 在 intellij 中,当我尝试运行单元测试用例时,整个基于 sbt 的项目会再次编译

  5. 另外,如果我在 intellij 中导入一个项目并同时使用 sbt 命令行,intellij 构建和命令行构建不能很好地相互配合,我开始观察 intellij 中的完整编译和奇怪的编译错误

【问题讨论】:

    标签: scala sbt sbt-assembly sbteclipse


    【解决方案1】:

    这只是部分答案,因为它在很大程度上取决于您在做什么以及您的代码是什么样的 - 但我倾向于不使用 IDE 进行编译/测试。相反,我在 sbt 中运行它(有时使用其他命令,取决于我在做什么)

    > ~test-quick
    

    哪个(quoting the docs):

    • 上次运行失败的测试
    • 之前未运行的测试
    • 重新编译具有一个或多个传递依赖项的测试,可能在不同的项目中。

    波浪号让它在每次代码更改时运行

    无论如何,对我来说,它非常快,重要的是只运行可能发生变化的部分

    我听说的另一件事(但不能保证会加快速度)是尽可能多地显式输入。类型推断器本来就是很慢的(当您考虑它必须做什么时,这是有道理的)

    根据 Saby 的要求进行编辑

    在我讨论您提出的观点之前,我只想指出,这些并不是真正的恐怖,而且 eclipse/intellij 实际上并不讨厌他们所做的事情。事实上,仔细想想,它们的工作原理令人印象深刻。

    Scala 是一种比 java 复杂得多的语言,这意味着编译器必须比 java 做更多的事情。我在这里谈论的是诸如宏、隐式和类型推断之类的特性。这些功能不是免费的,编译时间和内存会在这里受到影响。 (基本上是因为编译器必须使用各种疯狂的东西来进行类型推断;为宏运行多次代码;等等等等)

    显然,与任何其他语言一样,您的编译时间取决于很多因素:您使用什么功能、您使用什么模式、您必须使用什么依赖项等等。

    无论如何,一点一点:

    1. 老实说,我不知道如何回答这个问题。我目前正在处理一个小型 java 项目(想想十几个依赖项、几千行代码、一些 spring 但没有太多其他事情发生),而且我肯定不会在 Intellij 中获得毫秒级的编译时间。如果这确实引起了问题,那么我唯一的建议是使用命令行。

    2. 我对 Eclipse 一无所知,但如果您使用的是 Intellij 13 you can set the incremental compiler like this。 sbt 插件在 Intellij 14 中发生了相当大的变化,所以我认为这不再是一个选项(即它做任何事情)

    3. 我认为我上面的回答涵盖了这一点。关键是您不必使用 sbt 包,而我通常不需要。而是输入 sbt 并在加载时输入 ~test-quick 并且仅在需要时运行 sbt 包

    4. 这可能就是 intellij 的工作原理。像 3,我认为你不能再改变它了

    5. 我不知道这些是什么,但您可能应该用 Google 搜索该错误,如果找不到任何内容,请创建一个新的 Stack Overflow 问题并附上一些示例。

    其他需要考虑的事项

    设置可能很重要。大多数铁杆 Scala 开发人员都知道 sublime text 或 emacs 中的代码,他们使用名为 ensime 的插件和命令行上的 sbt 来测试/编译它(以及一个或两个 repl)。否则(无论如何在写这篇文章的时候),大多数其他人(包括我)使用 Intellij 编写他们的代码,然后在命令行上使用 sbt 或 Intellij 本身来测试/编译。您需要尝试并找到最适合您的。

    您要考虑的另一件事是您使用的 sbt 版本。我没有这方面的基准,但我记得旧版本速度较慢,并且仅仅因为您运行的是旧版本的东西而改变您的工作方式会很痛苦。

    还要确保您安装了 java 8 sdk - 我知道 Typesafe 的女孩和男孩正在花费越来越多的时间来优化 java 8 的 sbt。

    【讨论】:

    • 您能否按照问题本身的说明详细说明答案点
    • 你要求的吗?我会考虑并更新我的答案
    【解决方案2】:

    第 2 点和第 4 点对我有用(并且已经使用了很长时间),无需特殊设置。

    1. 另外,如果我在 intellij 中导入一个项目并同时使用 sbt 命令行,intellij 构建和命令行构建不能很好地相互配合,我开始观察 intellij 中的完整编译和奇怪的编译错误

    这应该是fixed in the new Scala plugin version。

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 2020-08-07
      • 2015-05-10
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 2016-01-16
      相关资源
      最近更新 更多