由于缓慢和各种问题,scala sbt编译恐怖

时间:2015-11-30 16:31:44

标签: scala sbt sbt-assembly sbteclipse

我正在使用sbt在scala编码时非常可怕。 我知道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和weired编译错误

2 个答案:

答案 0 :(得分:2)

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

> ~test-quick

quoting the docs):

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

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

无论如何,对我来说,它非常快,而且重要的是只运行本来可以改变的

我听到的另一件事(但不能承诺会加快速度)是尽可能明确地输入。类型推导者意味着非常缓慢(当你考虑它必须做什么时这是有意义的)

根据Saby的要求进行编辑

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

Scala是一种比java更复杂的语言,这意味着编译器必须比java更多。我在这里谈论的是宏,含义和类型推断等功能。这些功能不是免费的,编译时间和内存将在这里点击。 (主要是因为编译器必须使用各种类型推断的疯狂内容;为宏执行多次代码;等等等)

显然,与任何其他语言一样,您的编译时间取决于很多因素:您使用的功能,使用的模式,您只需指定几个依赖项。

无论如何,逐点:

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

  2. 我对eclipse一无所知,但如果你使用的是Intellij 13 you can set the incremental compiler like this。在Intellij 14中,sbt插件发生了很大的变化,所以我认为这不再是一个选项(即不管它做什么)

  3. 我认为上面的答案涵盖了这一点。关键是你不必使用sbt包,我通常不会。而是键入sbt,当它加载类型~test-quick并且只在需要时运行sbt包

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

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

  6. 需要考虑的其他事项

    设置非常重要。大多数核心Scala开发人员我使用名为ensime的插件和命令行上的sbt来知道sublime text或emacs中的代码来测试/编译它(以及一个或两个repl)。否则(在编写本文时),大多数其他人(包括我)使用Intellij编写代码,然后在命令行上使用sbt或者使用Intellij本身进行测试/编译。你需要玩,找到最适合你的东西。

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

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

答案 1 :(得分:0)

第2点和第4点只适合我(并且有很长时间),不需要特殊设置。

  
      
  1. 另外,如果我在intellij中导入项目并同时使用sbt命令行,则intellij构建和命令行构建彼此之间不能很好地兼容,我开始在intellij和weired编译中观察完整的编译错误
  2.   

这应该是fixed in the new Scala plugin version