在生产中进行滚动重启时,将AOT编译作为您应用程序JAR构建过程的一部分可以加快速度(构建JAR文件将明显变慢——您必须付出编译时间的“代价”)。
我们以前用源构建我们的uberjar应用,但我们也因生产中的启动时间变慢而受苦,所以我们切换到uberjar构建期间的AOT编译,这使我们从最差应用的约一分钟降低到仅几秒钟的生产启动时间。
至于持续集成(CI),为了运行测试,它们必须被加载和编译,因此您基本上无法避免这种时间耗费。您唯一的实际选项将是转向增量测试,并且只对变更或依赖于已变更代码的代码运行测试。对我们来说,这将是切换到Polylith的未来承诺之一,因为它内置的测试启动器可以根据git标签分析这个问题——但只有在您拥有“一切”后,这个好处才会体现出来。
Alex提到了关于加快开发加载的文档,我在工作中使用了一个本地的classes
文件夹在我的类路径上,并定期为我们存储库中的每个主要“应用程序”手动启动一个compile
步骤。这意味着自上次编译以来没有更改的任何代码都将仅使用现有的.class
文件,并且不必在加载时间通过Clojure编译过程——但是任何更改的代码在加载时仍然需要编译。
在REPL中进行工作时,初始加载时间会有很大的差异,但随着时间的推移,由于越来越多的代码被更改,它“漂移”。然而,在工作中,我们倾向于保持相当长久的REPL,并在修改代码时评估所有代码,因此慢速首次加载并不是那么烦人,我并不总是使用classes
这个方法。而且当我说“长久的REPL”时,意思是有时甚至长达几周甚至几个月。我的主要工作REPL到现在已经运行了十天,而且它之所以“这么短”,仅仅是因为我遇到了停电,不得不重启我的开发机器。