我来自PHP / Python / Javascript背景,最近对Scala非常感兴趣 - 特别是来自网络立场的Akka。
我在使用一般工作流程方面遇到了极其艰难的时期,与我所描述的解释语言相比存在问题。
一般来说,我倾向于编码,测试结果,编码和重复。即使更改20行类中的单行需要30秒来编译和运行,这也会停滞不前。这真的很正常吗?我是否需要构建,构建,构建然后返回30分钟或一小时后编译/测试?
(我正在使用IDEA和SBT)我是否需要专门学习如何使用Maven而不是链接到回购?
思考?建议?
答案 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开发,因为您提到PHP
和JavaScript
)后台有fsc
服务器正在运行也是为什么编译加速的原因之一。
有一些小的缺点,你不能改变超类,这意味着你不能从AbstractFunction1
转到{{1} }(代表匿名函数) - 将AbstractFunction2
更改为(x) => x
意味着您需要重新启动服务器。
有用的链接:
scala:cc
jrebel
答案 3 :(得分:1)
静态类型语言的一个优点是类型系统可以捕获几种类型的错误/错误。所以,从理论上讲,你不应该经常经历严峻的考验。
当然,有许多变化,特别是在UI中,只有屏幕上的眼球可以检查。我只能建议有良好的模块化来保持编译/构建时间。和单元测试。我不知道您来自哪个社区,但在java / scala中,强烈建议使用单元测试。你可以通过这种方式找出代码是否运行得更快。
答案归结为:尽量避免构建并重新启动以尽可能多地检查您的工作。
答案 4 :(得分:1)
我类似Python的工作流程 - 让我只有很少的时间等待 - 通常如下:
将我正在尝试的内容转换为库(将其粘贴在.jar
中并将其添加到类路径中。)
在编辑器中处理新代码,但将其粘贴到REPL中而不是单独编译。一旦运行良好,请添加单元测试。
将新代码放入库中。重复。
我可以在上网本上执行此操作,而不是等待任何一步的时间超过~3秒。