【问题标题】:Forcing Cake to reload functions from my .clj files强制 Cake 从我的 .clj 文件中重新加载函数
【发布时间】:2012-10-10 20:24:04
【问题描述】:

我是 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 显然已重新加载,但我在 main 函数中所做的更改没有打印出来!只有当我用 cake kill 停止 JVM 并重新运行它时,我才会得到想要的结果 - 但是如果我每次更改函数时都必须重新启动 JVM,我还不如回到 lein...

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

【问题讨论】:

标签: clojure jvm


【解决方案1】:

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

如果您使用 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 重新加载所有命名空间及其所有依赖的命名空间(这接近于解决您的问题)
  • 破解、加载、重复 ;-)

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

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

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

【讨论】:

  • 我明白了...我认为这整个develop-in-repl 都是SmallTalk 的事情。我要给它一个表演。
  • 我的经验的主要区别在于 REPL 通过网络连接到编辑器(nrepl = network 中的 n)并且可以有许多附件(一个用于测试,一个用于 Emacs)跨度>
【解决方案2】:

我曾经也为缓慢的 JVM 启动速度而苦恼,并且在使用 Cake 时取得了不同程度的成功。你可能想看看 Leiningen 的出色的 autoexpect 插件,详细解释了 in the author's blog post。基本上,每次更新工作目录树时,autoexpect 都会重新加载您的代码(并评估任何 expect 子句,报告任何测试失败)。使连续测试成为梦想——我有时在 Emacs 中有 两个 shell——一个用于 lein autoexpect 的输出,一个用于连接的 REPL 以将代码的 sn-ps 发送到另一张海报正在建议。

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

【讨论】:

    猜你喜欢
    • 2014-03-02
    • 2020-03-08
    • 2011-07-02
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    相关资源
    最近更新 更多