9

当我在 Play 2 应用程序中编辑 scala 文件时,有时只重新编译了几个文件,但通常必须重新编译整个代码库:

[info] Compiling 1 Scala source to /home/michael/code/superglot/target/scala-2.10/classes...
[success] Compiled in 1s

相对

[info] Compiling 2 Scala sources to /home/michael/code/superglot/target/scala-2.10/classes...
[info] Compiling 52 Scala sources and 1 Java source to /home/michael/code/superglot/target/scala-2.10/classes...
[success] Compiled in 13s

但是,对于何时需要完全重新编译,我看不到明显的模式。如果我向模型或控制器类添加一些空格,它可能只会编译该文件,但对可比较的文件执行相同操作会触发重新编译。

我希望的重新加载次数接近 1 秒,因为目前我经常等待完全重新编译。我很乐意重构我的代码以使我正在处理的区域更快地重新加载,但我不知道我什至可以做些什么来实现这一点。对于一个典型的 Play 2 应用程序来说,频繁的重新编译是正常的,还是我的有什么异常?

4

2 回答 2

7

通常,如果您更改文件的“源 API”,则会重新编译该文件的依赖项。源 API 由非私有方法和类型的签名组成。因此,如果您有一个所有内容都依赖的文件,则对该文件中签名的更改可能会导致大量重新编译。此外,当祖先的 API 发生变化时,必须重新编译所有后代。

您可以从中获取一些附加信息last compile,例如触发其他文件重新编译的原因。(在多模块构建中,last <project-name>/compile)您可以

如果添加无关紧要的空格会导致重新编译其他文件,则它始终是一个错误,通常在 scalac 本身中。这种错误的一个例子是SI-7361(不是说它对除了编译器开发人员之外的任何人都有用!),它在 sbt here中得到解决。为了解决这些问题,我们需要一个可重现的测试用例。(考虑到这方面经常涉及的工作,您可能会等待 0.12.4 或 0.13.0 看看它们是否能解决您的问题。)

0.13.0 有一些改进,有望减少 API 更改时失效的内容。

于 2013-05-11T01:16:16.290 回答
1

我认为您在这里采用了稍微错误的方法。由于无法成功确定哪些更改将导致完全重新编译,因此该路径无处可去。

出于学习目的,更好地了解编译器的内部结构可能会有所帮助,但从生产力的角度来看,有一个更好的选择,那就是 jRebel,他们多年来一直在提供免费的 Scala 许可证。

叛逆者

这里,您可以在几分钟内获得免费的 Scala 许可证。然后继续并将其添加到 sbt 配置中。它必须直接进入sbt文件。

Linux/Mac

java -noverify -javaagent:/opt/zt/jrebel/jrebel.jar \
 -Xmx1024M -Xss2M -XX:MaxPermSize=512m -XX:+CMSClassUnloadingEnabled -jar \
 `dirname $0`/sbt-launch-0.12.jar "$@"

视窗

set SCRIPT_DIR=%~dp0
java -noverify -javaagent:c:/opt/zt/jrebel/jrebel.jar \
 -XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256m -Xmx1024M -Xss2M \
 -jar "%SCRIPT_DIR%\sbt-launch-0.12.jar" %*

在这个阶段,如果您做的一切都正确,当您重新启动 SBT 控制台时,您将看到 jRebel 代理已启动,您将从实时重新部署更改中受益。当您Save在 IDE 中时,JRebel 将仅重新加载您所做的更改

于 2013-05-11T11:50:05.773 回答