我想创建一个leiningen应用程序的uberjar。我的配置是:
:uberjar {:omit-source true
:aot :all
:uberjar-name "myapp.jar"
:source-paths ["env/prod/clj" ]
:resource-paths ["env/prod/resources"]}但在执行lein uberjar时,我发现项目中的文件正在编译,但编译过程在包含大部分代码的文件上停滞不前,持续了十分钟,而且还在继续。此文件包含的行数不超过140行。
发布于 2021-05-05 03:02:24
TL;DR:从不def副作用
如评论中所述:
...我只是想到了这一行:
(defonce server (http/start-server server-handler {:port 8982}))导致了挂起。
不要把这样的东西放在最高层。
defonce只意味着它一旦存在就不会被重新定义(所以在这种情况下,它可以防止在重新加载时出现一些“端口已经在使用中”的错误。
走出困境的方法
写一个函数,启动这个服务器。然后从你的main调用它。对于开发,您可以从REPL运行该函数,或者在您的user-ns中散布一些重新加载/重新启动逻辑。
另一种选择是使用delay:它只会在derefed之后执行代码。
你必须处理的“资源绑定”越多,一些系统化的方法就会给你的应用程序带来更好的结构。例如,看一下:
那么为什么在def中放置阻塞的东西或副作用是有问题的呢?
Clojure编译器的工作方式实际上是“运行”代码。所以compile基本上是:
这意味着,在编译时,会执行顶级副作用。因此,在def中的阻塞操作将阻塞编译(这是很明显的),或者您的CI服务器将无法编译,因为它无法连接到数据库等。
很好地解释了Clojure中的代码生成是如何工作的:
https://stackoverflow.com/questions/67367458
复制相似问题