1

我在 scala 中使用 sbt 编码的时间非常糟糕。我知道与 java 相比,scala 中的编译本质上很慢。

我已经尝试过 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 中的完整编译和奇怪的编译错误

4

2 回答 2

2

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

> ~test-quick

其中(引用文档):

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

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

无论如何,对我来说,它非常快,重要的是只运行可能会改变的东西

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

根据 Saby 的要求进行编辑

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

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

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

无论如何,一点一点:

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

  2. 我对eclipse一无所知,但是如果您使用的是Intellij 13 ,则可以像这样设置增量编译器。sbt 插件在 Intellij 14 中发生了相当大的变化,所以我认为这不再是一个选项(即它做任何事情)

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

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

  5. 我不知道这些是什么,但你可能应该用谷歌搜索错误,如果你找不到任何东西,用一些例子创建一个新的 Stack Overflow 问题。

其他需要考虑的事项

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

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

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

于 2015-11-30T16:46:33.000 回答
0

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

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

这应该在新的 Scala 插件版本中得到修复

于 2015-12-01T08:05:44.857 回答