【发布时间】:2013-01-24 15:10:00
【问题描述】:
据我了解,当我执行nrepl-jack-in 时,会加载一个 REPL 以及 project.clj 中定义的所有依赖项。如果我然后更新 project.clj 以添加新的依赖项,我是否需要终止服务器并重新运行 nrepl-jack-in 或者有没有办法更新当前 REPL 中的依赖项?
【问题讨论】:
据我了解,当我执行nrepl-jack-in 时,会加载一个 REPL 以及 project.clj 中定义的所有依赖项。如果我然后更新 project.clj 以添加新的依赖项,我是否需要终止服务器并重新运行 nrepl-jack-in 或者有没有办法更新当前 REPL 中的依赖项?
【问题讨论】:
重启 REPL 似乎是最简单的方法。这可以做到 与:
M-x cider-restart
这似乎也完成了lein deps。所以整个过程
添加新依赖项只需将require 添加到
你的project.clj,然后调用cider-restart。
另一种(非常方便)的方式是使用
clj-refactor。
添加工件(C-c m a p 或cljr-add-project-dependency)
会提示输入你想要的版本,自动把新的
依赖于您的project.clj 文件,然后重新加载您的会话。
【讨论】:
cider-restart 不会更新 project.clj 中描述的依赖项。
cider-quit 和cider-jack-in。 clj-refactor 使得添加依赖到 project.clj 更加方便。
更新:也许有一些希望, 见https://github.com/cemerick/pomegranate
以前:
简短的回答是肯定的 - 你必须重新启动 JVM 进程。
我知道没有好的方法可以在实时 repl 中更新依赖项。 Leiningen(由 nrepl-jack-in 调用)将管理依赖项并仅在重新启动时设置类路径。尝试做一些充满活力和聪明的事情是非常脆弱的。
下面被删除的文字实际上是真实的,但经过片刻的反思,我认为这是一个糟糕的建议,我将其标记为......
如果您有本地依赖项(例如 jar 文件),您可能会在 repl 中使用长期不推荐使用函数add-classpath。但是你将进入java类加载器的龙出没沼泽。
【讨论】:
在 pomegranate 出现之前,我编写了自己的库来动态加载依赖项。
https://github.com/bmillare/dj
在 lein2 发布后,以及它如何在封面下使用 pomegrante,我重写了 dj 以在下面使用它。所以,即使你不使用 'dj',它也可能是一个有用的参考,看看它在做什么。
【讨论】: