Clojure 强制Cake从my.clj文件重新加载函数

Clojure 强制Cake从my.clj文件重新加载函数,clojure,jvm,Clojure,Jvm,我是Clojure的新手,在我浪费了太多的时间等待Leiningen运行我的代码之后,我正试图转向Cake。虽然Cake的持久化JVM的加载速度非常快——这带来了一个更大的问题——但我的函数也是持久的 为了演示这个问题,我启动了一个cake项目(使用cake new mass with cake),并在core.clj中编写了这个项目: (ns mess-up-with-cake.core) (defn main-function[] (println "I'm in the main f

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

为了演示这个问题,我启动了一个cake项目(使用
cake new mass 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") 
(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)
)
这是
project.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") 
(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)
)
使用
蛋糕我的任务运行它时,我得到:

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快多少。)

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

如果您想在运行leiningen的地方运行,则听起来像是您的工作流:

  • lein run
  • 等待JVM启动。。。。无聊
  • 观察结果
  • 编辑代码
  • 重复
在大多数语言中,这是一种非常常见的模式,它偶尔用于Clojure开发(这里Cake非常有用)。Clojure开发通常使用项目的单个实例,并使用nrepl(或Slime和Swank)将编辑器连接到该实例。因为大多数人在进行开发时都会让项目运行,所以没有多少人感觉到这种痛苦,因此我认为解决方案没有那么好。Cake在很大程度上已经并入了Leiningen,Cake项目的未来方向对我来说并不清楚(在这一点上我很可能是错的)。在我认识的Clojureian人中,他们都搬到了Leiningen,从Emacs或vim这样的编辑器连接到他们的项目

常见的工作流程是:

  • 启动Emacs
  • M-x nrepl插孔
  • Ctrl-c Crtl-l以重新加载所有名称空间及其所有依赖名称空间(这接近于解决问题的方法)
  • 破解、加载、重复;-)
此工作流不是特定于Emacs或VI的,Eclipse和Intelij使用相同的方法

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


我发现,即使是我的大型项目,时间也不超过两秒钟。这可能无法直接回答您的问题,但我希望这会有所帮助:

如果您想在运行leiningen的地方运行,则听起来像是您的工作流:

  • lein run
  • 等待JVM启动。。。。无聊
  • 观察结果
  • 编辑代码
  • 重复
在大多数语言中,这是一种非常常见的模式,它偶尔用于Clojure开发(这里Cake非常有用)。Clojure开发通常使用项目的单个实例,并使用nrepl(或Slime和Swank)将编辑器连接到该实例。因为大多数人在进行开发时都会让项目运行,所以没有多少人感觉到这种痛苦,因此我认为解决方案没有那么好。Cake在很大程度上已经并入了Leiningen,Cake项目的未来方向对我来说并不清楚(在这一点上我很可能是错的)。在我认识的Clojureian人中,他们都搬到了Leiningen,从Emacs或vim这样的编辑器连接到他们的项目

常见的工作流程是:

  • 启动Emacs
  • M-x nrepl插孔
  • Ctrl-c Crtl-l以重新加载所有名称空间及其所有依赖名称空间(这接近于解决问题的方法)
  • 破解、加载、重复;-)
此工作流不是特定于Emacs或VI的,Eclipse和Intelij使用相同的方法

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


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

我过去也一直在努力解决JVM启动速度慢的问题,而且成功与否参差不齐。您可能想看看Leiningen的优秀插件,详细解释如下。基本上,每次更新工作目录树时,autoexpect都会重新加载代码(并计算任何
expect
子句,报告任何测试失败)。让连续测试成为一个梦想——我有时在Emacs中有两个shell——一个用于
lein autoexpect
的输出,一个用于连接的REPL,以便按照另一张海报的建议将代码片段发送到


我非常喜欢为我的非Clojure开发()编写的连续测试风格——对于Clojure,我使用
autoexpect

我也曾与缓慢的JVM启动速度作斗争,并且成功与失败并存。您可能想看看Leiningen的优秀插件,详细解释如下。基本上,每次更新工作目录树时,autoexpect都会重新加载代码(并计算任何
expect
子句,报告任何测试失败)。让连续测试成为一个梦想——我有时在Emacs中有两个shell——一个用于
lein autoexpect
的输出,一个用于连接的REPL,以便按照另一张海报的建议将代码片段发送到


我非常喜欢为我的非Clojure开发()编写的连续测试风格——对于Clojure,我使用
autoexpect

我明白了。。。我以为整个repl的开发都是闲聊。我要给它一个嘘