强制Cake从我的.clj文件中重新加载函数



我是Clojure的新手,在等待Leiningen运行我的代码已经浪费了太多的生命之后,我正试图转到Cake。虽然Cake的持久JVM加载得非常快——这带来了一个更大的问题——但我的函数也是持久的!

为了证明这个问题,我开始了一个蛋糕项目(使用cake new mess-up-with-cake),并在core.clj:中写下了这篇文章

(ns mess-up-with-cake.core)
(defn main-function[]
(println "I'm in the main function")
)
(println "I'm in core.clj, not inside in any function") 

这是project.clj:

(defproject mess-up-with-cake "0.0.1-SNAPSHOT"
:description "TODO: add summary of your project"
:dependencies [[clojure "1.2.0"]])
(use 'mess-up-with-cake.core)
(deftask my-task
(println "I'm in my task")
(main-function)
)

当用cake my-task运行它时,我得到:

I'm in core.clj, not inside in any function
I'm in my task
I'm in the main function

这并不奇怪。

现在,我已经将core.clj更改为:

(ns mess-up-with-cake.core)
(defn main-function[]
(println "I'm in the main function")
(println "I've made a change in the main function")
)
(println "I'm in core.clj, not inside in any function")
(println "I've made a change outside the main function") 

当我运行它时,我会得到

I'm in core.clj, not inside in any function
I've made a change outside the main function
I'm in my task
I'm in the main function 

core.clj显然是重新加载的,但我在主函数中所做的更改没有打印出来!只有当我用cake kill停止JVM并重新运行它时,我才会得到所需的结果——但如果每次更改函数时都必须重新启动JVM,我还不如回到lein。。。

你知道如何强制cake重新加载我的函数吗?(而且只有我的函数-重新加载整个Clojure运行时+我正在使用的任何库可能不会比重新启动JVM快多少。)?

这可能无法直接回答您的问题,但我希望它能有所帮助:

如果你在哪里使用莱宁根,这听起来像是你的工作流程:

  • lein run
  • 等待JVM启动。。。。感到无聊
  • 观察结果
  • 编辑代码
  • 重复

这是大多数语言中非常常见的模式,偶尔也会用于Clojure开发(Cake在这里非常有用)。Clojure开发更常见的做法是使用项目的单个实例,并使用nrepl(或Slime和Swank)将编辑器连接到该实例。因为大多数人在进行开发时都离开了项目,所以没有多少人感到这种痛苦,所以在我看来,解决方案并没有那么好。Cake在很大程度上已经并入了Leiningen,我不清楚Cake项目的未来方向(我很可能在这一点上错了)。在我认识的Clojureians中,他们都搬到了Leiningen,并从Emacs或vim这样的编辑那里连接到他们的项目。

一个常见的工作流程是:

  • 启动Emacs
  • M-x nrepl插孔
  • Ctrl-c Crtl-l以重新加载所有名称空间及其所有依赖名称空间(这接近于您的问题的解决方案)
  • 破解、加载、重复;-)

此工作流不是Emacs或VI特定的,Eclipse和Intelij 使用了相同的方法

re:"重新加载整个Clojure运行时+我正在使用的任何库可能不会比重新启动JVM快多少"。

我发现即使我的大型项目也不超过两秒钟

我过去也曾与缓慢的JVM启动速度作斗争,在Cake方面取得了喜忧参半的成功。你可能想看看Leiningen出色的autoexpect插件,作者在博客文章中详细解释了这一点。基本上,每次更新工作目录树时,autoexpect都会重新加载代码(并评估任何expect子句,报告任何测试失败)。让持续测试成为一个梦想——我有时在Emacs中有两个shell——一个用于lein autoexpect的输出,另一个用于连接的REPL,以发送代码片段,正如另一个海报所建议的那样。

我非常喜欢连续测试风格,所以我用Python为我的非Clojure开发编写了一个类似的实用程序(在本博客文章中描述)——对于Clojure,我使用autoexpect

最新更新