在Clojure REPL中动态加载依赖项

10

如何在运行中的Clojure REPL中下载和安装之前未指定的Maven依赖项?

我想到的是一种非常普遍的情况,即您希望快速暂时地引入某个依赖项进行测试或可视化工具,但不想关闭当前的REPL会话。

例如,如果您想在当前的REPL会话中拉取Incanter以绘制一些漂亮的数据图表,可以使用以下命令:

(load-dependency "incanter" "incanter" "1.3.0-SNAPSHOT")

;; now do stuff with Incanter......

我想你可能需要在Maven或Leiningen中从适当的存储库触发依赖项解析/加载,但我对它们的内部知识不足,无法确定是否可以在运行时实现此操作.....


1
有另一种方法正在开发中:http://insideclojure.org/2018/05/04/add-lib/ 截至2019-06-07,它在尚未合并的分支中(https://github.com/clojure/tools.deps.alpha/compare/add-lib)。 - bmaddy
2个回答

6

Alembic是一个Leiningen插件,可以将这个功能添加到REPL中。

README中的直接引用:

Alembic是一个Clojure库,允许您在运行的JVM实例上蒸馏jar。您可以使用它以临时方式向运行的REPL添加依赖项,或通过重新加载project.clj文件来添加依赖项。

它还添加了一个(load-project)函数,解析project.clj并动态添加缺少的依赖项。


6

太棒了 - 这看起来完美地符合要求!有趣的是,Incanter的例子与pomegrenade文档中使用的相同 :-) - mikera
@mikera 你真的很幸运,这个库大约5天前发布了 http://disclojure.org/2011/10/05/today-in-the-intertweets-oct-5th-ed-3/. - ponzao
我注意到URL的拼写是正确的(石榴),但链接却是一个相当滑稽的石榴手榴弹。我想知道,这是一种我没有理解的奇怪的以手榴弹为主题的玩笑吗? - amalloy
哈哈。我想那是我的拼写错误。这是我犯的一个愚蠢的错误。虽然“granate”和“grenade”是同一个单词,只是前者是法语,后者是英语(石榴被音译为“grenade apple”)。我在原帖中加了注释来纠正我的错误。 - Joost Diepenmaat
这里插一句,如果你想使用完全基于Clojure的依赖系统,github.com/bmillare/dj支持运行时加载依赖项。此外,它还支持本地依赖项的动态加载。 - bmillare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接