在部署中执行滚动重启时,将AOT编译作为应用程序JAR构建过程的组成部分将加快该过程(构建JAR将会慢得多——你不得不在某个地方支付编译时间“罚金”)。
我们曾以源代码构建我们的应用uberjars,但我们也经历过生产环境中启动时间慢的问题,所以我们改在uberjar构建时进行AOT编译,这降低了从最差的几个应用程序的分钟左右的生产启动时间到只几秒钟。
至于CI,为了运行测试,必须加载和编译它们,因此你实际上无法避免这个地方的时间。你唯一真正的选择将是转向增量测试,并且只为更改了代码或依赖于更改了代码的代码运行测试。对于我们来说,这是切换到Polylith未来的一个承诺之一,因为其内置的测试运行程序根据git标签解决这个问题——但这种好处只能在你拥有“所有”Polylith后才能体现。
Alex提到了关于加快开发加载的文档,我在工作中使用了这个文档,通过在我的类路径上有一个本地的classes
文件夹并定期为我们的仓库中的主要“应用程序”手动执行compile
步骤。这意味着自上次编译以来没有任何更改的任何代码将仅使用现有的.class
文件,并无需在加载时通过Clojure编译过程——但任何已更改的代码在加载时仍然需要编译。
当在REPL中工作时,对初始加载时间有很大影响,但过了段时间,会有越来越多的代码被更改,随着代码更改,“它”开始“漂移”。然而,在工作中,我们倾向于拥有寿命相当长的REPL,并在修改代码时全部进行评估,因此快速加载问题不是很讨厌,我并不总是忙着处理那个classes
事情。当我提到“长寿REPL”时,我指的是几周到甚至几个月。我主要的工作REPL到目前为止已经运行了十天,唯一的原因是停电导致我不得不重新启动我的开发机器。