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

时间:2012-10-10 20:24:05

标签: clojure jvm

我是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 ...

任何想法如何强制蛋糕重新加载我的函数(以及我的函数 - 重新加载整个Clojure运行时+我正在使用的任何库可能不会比重新启动JVM快得多。 。)?

2 个答案:

答案 0 :(得分:3)

这可能不会直接回答你的问题,但我希望它有所帮助:

如果你使用leiningen的话,这听起来像你的工作流程:

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

这是大多数语言中非常常见的模式,它偶尔会用于Clojure开发(而Cake在这里非常有用)。 Clojure开发使用项目的单个实例并使用nrepl (或Slime和Swank)将编辑器连接到该实例更为常见。因为大多数人在开发过程中都会让项目继续运行,所以没有多少人感到这种痛苦,因此我认为解决方案不是很好。 Cake已经基本上被合并到了Leiningen,而Cake项目的未来发展方向对我来说并不清楚(在这一点上我很可能是错的)。在我所知道的Clojureians中,他们都搬到了Leiningen并从Emacs或vim这样的编辑器连接到他们的项目。

常见的工作流程是:

  • 启动Emacs
  • M-x nrepl-jack-in
  • Ctrl-c Crtl-l重新加载所有命名空间及其所有依赖命名空间(这接近于您的问题的解决方案)
  • hack,load,repeat; - )

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

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

即使我的大项目

,我发现它不会超过两秒钟

答案 1 :(得分:1)

我曾经在缓慢的JVM启动速度上苦苦挣扎,并且在Cake上取得了成功。你可能想看一下Leiningen的优秀autoexpect插件,有些篇幅in the author's blog post。每次更新工作目录树时,autoexpect基本上都会重新加载代码(并评估任何expect子句,报告任何测试失败)。使连续测试成为梦想 - 我有时会在Emacs中使用两个 shell - 一个用于输出lein autoexpect,一个用于连接REPL以发送代码片段作为另一个海报建议。

我非常喜欢连续的测试风格我为非Clojure开发a similar utility in Python编写described in this blog post - 对于Clojure,我使用autoexpect