学习Scala作为第一个VM /编译语言 - 工作流程挑战

时间:2011-01-11 18:24:43

标签: scala workflow intellij-idea sbt

我来自PHP / Python / Javascript背景,最近对Scala非常感兴趣 - 特别是来自网络立场的Akka。

我在使用一般工作流程方面遇到了极其艰难的时期,与我所描述的解释语言相比存在问题。

一般来说,我倾向于编码,测试结果,编码和重复。即使更改20行类中的单行需要30秒来编译和运行,这也会停滞不前。这真的很正常吗?我是否需要构建,构建,构建然后返回30分钟或一小时后编译/测试?

(我正在使用IDEA和SBT)我是否需要专门学习如何使用Maven而不是链接到回购?

思考?建议?

5 个答案:

答案 0 :(得分:8)

我认为你与Idea和SBT走在正确的轨道上。你试过吗

~compile

这将自动检测源的更改。对于Web应用程序,您可以执行

jetty-run

接着是

~prepare-webapp

继续编译应用程序并将其重新部署到码头。使Scala开发感觉像Python Web开发一样。

通常我在编译时发现SBT非常快,特别是你正在谈论的大小文件。当我保存更改并转到SBT提示时,已完成。

另一个方便的SBT方面是REPL,它将加载你的项目及其依赖项:

console

您可以使用

重新加载任何已编译的更改
:replay
scala REPL中的

编辑: 猜猜我应该提一下,你可以用一个简单的类来使用main方法。如果您创建一个名为src / main / scala / Foo.scala的文件,如下所示:

object Foo {
  def main(args: Array[String]) {
    println("Hello World")
  }
}

像这样的文件项目/ build / Build.scala:

import sbt._
class Build(info: ProjectInfo) extends DefaultProject(info) {
  override def mainClass = Some("Foo")
}

然后在sbt提示符下,你可以

~run

连续编译并运行Foo.main方法。您可能需要先在sbt中执行“重新加载”。从保存更改到看到输出似乎需要2-3秒。然后你只需编辑,保存并查看更改。这是一个非常好的工作流程。

另外,不要忘记REPL - 绝对是学习Scala的重要工具。你可以通过互动方式学习它。

答案 1 :(得分:5)

IDE帮助:

使用静态类型语言,我发现自己在工作流程方面的工作量少于动态类型,但这只是因为优秀的IDE帮助(键入信息允许它提前检测错误,并在您提供时提供准确的建议)编辑),所以它确实在你描述的代码测试循环中节省了一些时间。

然而,IDEA中的Scala IDE支持尚未达到Java的水平,例如, 在编辑(IMHO)和编译速度时捕获错误。

REPL /脚本支持:

不要忘记您仍然可以使用Scala REPL,工作流程与您在Python中习惯的工作流程非常相似。

IDEA + Scala速度:

有关IDEA + Scala速度的更多讨论,请参阅this question

答案 2 :(得分:2)

我将JRebel插件与maven一起使用。我关闭了NetBeans编译保存功能,(不知道intellij是否有相似之处)并运行scala:cc - 来自控制台的连续编译目标。它等待源代码中的任何更改,因此在您创建之后,文件将被编译,复制到/target目录,然后热插入到正在运行的虚拟机中。该过程需要几秒钟的时间,具体取决于文件的大小。(我假设您进行了Web开发,因为您提到PHPJavaScript)后台有fsc服务器正在运行也是为什么编译加速的原因之一。
有一些小的缺点,你不能改变超类,这意味着你不能从AbstractFunction1转到{{1} }(代表匿名函数) - 将AbstractFunction2更改为(x) => x意味着您需要重新启动服务器。
有用的链接:
scala:cc
jrebel

答案 3 :(得分:1)

静态类型语言的一个优点是类型系统可以捕获几种类型的错误/错误。所以,从理论上讲,你不应该经常经历严峻的考验。

当然,有许多变化,特别是在UI中,只有屏幕上的眼球可以检查。我只能建议有良好的模块化来保持编译/构建时间。和单元测试。我不知道您来自哪个社区,但在java / scala中,强烈建议使用单元测试。你可以通过这种方式找出代码是否运行得更快。

答案归结为:尽量避免构建并重新启动以尽可能多地检查您的工作。

答案 4 :(得分:1)

我类似Python的工作流程 - 让我只有很少的时间等待 - 通常如下:

  • 将我正在尝试的内容转换为库(将其粘贴在.jar中并将其添加到类路径中。)

  • 在编辑器中处理新代码,但将其粘贴到REPL中而不是单独编译。一旦运行良好,请添加单元测试。

  • 将新代码放入库中。重复。

我可以在上网本上执行此操作,而不是等待任何一步的时间超过~3秒。