如何在Grails中设置静态编译?

h0n*_*zan 2 environment grails static-compilation

我是Grails的初学者,我想使用静态编译,但我不想GrailsCompileStatic为每个类使用注释.我可以为配置文件中的所有类设置它吗?

GrailsCompileStatic注释不能使用,因为我需要用一个静态编译只是为了生产环境.对于其他环境应该使用动态编译.

有谁知道解决方案,拜托?如何验证使用的编译?

谢谢你的回答..

Bur*_*ith 9

您不希望全局静态编译.看起来你不明白是什么@CompileStatic,因为你希望它在dev中活跃而不是prod.它具有所有的功能@TypeChecked,因此编译器和Java编译器一样具有攻击性.这听起来不错,因为它会在编译时捕获拼写错误和其他错误,而不是在运行时使用传统的Groovy.这确实发生了,但你也失去了很多功能.

除了使用严格类型检查器之外,还@CompileStatic禁用所有动态Groovy功能.这基本上是编译时无法知道的所有内容.它不会影响像list comprehensions(def foo = [1, 2, 5])那样的语法糖特性,因为它基本上是创建一个新的ArrayList并将项添加到它的替代品,所以很明显它是有效的.

您还会发现许多插件无法使用,因为它们使用动态Groovy功能,并且代码无法在您的应用程序中编译.然而,这可能是积极的; 你的团队将学到更多关于Grails的知识,因为他们必须重新发明这么多车轮;)

但是你会丢失很多GORM方法,特别是动态查找器.许多GORM方法都不是动态的,所以它们是通过AST转换添加的,但User.findAllByAgeAndGender(...)它是动态的,因为在启动时找出所有组合太昂贵了.

所以你必须非常小心在开发模式下使用什么是安全的,什么不是,因为如果有人忘记并使用动态方法,你就不会知道这种情况发生在一些用户在生产中遇到代码路径之前.

静态类型检查和编译是Groovy中的强大功能,但在Grails应用程序中使用它们100%的代码将比我预期的性能显着降低.如果您查看完成向服务器发送Web请求并返回客户端所需的总时间,则会有很多因素.DNS查找和网络速度占用了大量时间,对于大多数应用程序而言,大部分请求时间都花在等待数据库查询和更新运行上.Grails/Groovy代码花在工作上的总时间将会相当低,而且它只是在服务器上花费的非数据库时间的一部分.剩下的时间是Grails代码,它是用Java或Groovy编写的(混合使用@CompileStatic和动态),以及Spring和其他第三方库.如果Groovy代码占20%的时间(我怀疑它的平均值是那么高)并且你能够使代码运行速度提高两倍,@CompileStatic那么你将减少20%到10%.是的,它更快,但不太可能明显更快,而且你会让你的工作变得不那么有趣,因为你会不断地对你应该做但不能做的事情感到沮丧.

如果你愿意放弃这么多,也许Grails不是最好的选择.