在生产中,将AOT编译作为应用JAR构建过程的一部分,可以加快滚动重启(构建JAR将显著减慢—你必须在某个地方支付编译时间的“惩罚”)。
我们过去将应用程序uberjars作为源代码构建,但在生产中也遭受了启动时间缓慢的问题,因此我们在构建uberjar时转向了AOT编译,这使得我们的生产启动时间从最差的几个应用程序一分钟来降低到仅仅几秒钟。
至于CI,为了运行测试,它们必须被加载和编译,因此你实际上无法避免在某个地方这段时间。你唯一真正可做的选择就是转到增量测试,并且只为更改的代码或依赖于更改代码的代码运行测试。对于我们来说,这是转换到Polylith的未来的一个承诺之一,因为其内置的测试运行器基于Git标签计算这一点—但这个好处只有在你有“一切”都在Polylith中才会出现。
Alex提到了加快开发加载的文档,我在工作中使用它,通过在我的类路径上创建一个本地的classes
文件夹,并定期为我们的代码库中的每个主要“应用程序”手动启动一个compile
步骤。这意味着自上次编译以来没有更改的任何代码都将仅使用现有的.class
文件,并且无需在加载时间通过Clojure编译过程 - 但任何已有更改的代码仍然需要在加载时编译。
在REPL中工作时对初始加载时间有很大影响,但随时间推移,由于越来越多代码的更改,它会“漂移”。然而,在工作中,我们倾向于拥有长时间运行的REPL,并在修改时评估所有代码,因此首次加载的慢问题不是那么烦人,我不需要经常打扰classes
。当我提到“长时间运行的REPL”时,我的意思是几周到有时几个月。我的主要工作REPL已经运行了十天,唯一的原因是停电,我不得不重启我的开发机器。