在我的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但是,在需要完全重新编译的情况下,我看不到明显的模式。如果我在模型或控制器类中添加一些空格,它可能只会编译该文件,但是对类似的文件进行同样的操作将触发重新编译。
我希望有更多的重新加载接近1s,因为目前我正等待一个完整的重新编译的频率比没有。我很乐意重构我的代码,使我正在工作的区域更快地重新加载,但我不知道我能做些什么来实现这个目标。对于一个典型的Play 2应用程序来说,频繁的重新编译是正常的,还是我的程序有什么反常之处?
发布于 2013-05-11 01:16:16
通常,如果更改文件的“源API”,则会重新编译该文件的依赖项。源API由非私有方法和类型的签名组成。因此,如果您有一个所有所依赖的文件,那么对该文件中签名的更改可能会导致大量的重新编译。另外,当祖先的API发生变化时,必须重新编译所有的后代。
您可以从last compile获得一些其他信息,例如是什么触发了要重新编译的其他文件。(在多模块构建中,last <project-name>/compile)您可以
如果添加不重要的空格会导致重新编译其他文件,那么它总是一个错误,通常在scalac本身中。这种错误的一个例子是西-7361 (除了编译器开发人员之外,它对任何人都不有用!)这在sbt 这里中得到了应用。为了修复这些问题,我们需要一个可重复的测试用例。(考虑到这方面经常涉及的工作,您可能会等待0.12.4或0.13.0来查看这些方法是否解决了您的问题。)
0.13.0有一些改进,希望能减少API更改时失效的内容。
发布于 2013-05-11 11:50:05
我认为你在这方面采取了稍微错误的做法。由于无法成功地确定哪些更改将导致完全重新编译,因此该路径没有任何方向。
为了学习的目的,更好地了解编译器的内部结构也许是有帮助的,但是从生产力的角度来看,还有一个更好的选择,那就是jRebel,他多年来一直发放免费Scala许可证。
JRebel
从这里,您可以在几分钟内获得免费的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 "$@"Windows
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代理已经启动,您将从您的更改的实时重新部署中获益。当您在IDE中使用Save时,JRebel只会重新加载,只加载您所做的更改。
https://stackoverflow.com/questions/16490525
复制相似问题