您的位置:首页 > 其它

生活在REPL中(续):在REPL中动态加载依赖的库

2016-04-17 00:51 316 查看
在之前的文章《生活在REPL中:工具与程序一体》中,我描绘了把
Clojure REPL
当做
SHELL
来使用的场景,在
REPL
中做诸如访问数据库、加解密等日常开发工作。

但使用
REPL
中最郁闷的就是依赖的类库无法动态加载。例如代码运行到一半,忽然发现需要解析
JSON
字符串,不得不退出
REPL
,在
project.clj
中添加依赖的
JSON
解析包,然后重新进入REPL并敲一堆代码恢复到之前退出的场景。这一方面
Clojure
或者说
Java
无法做到像
SHELL
那样简便地修改
PATH
环境变量一样修改
CLASSPATH
,以实现动态加载类库的目的。

今天终于下决心解决这个问题,并且我相信肯定已经有解决方案了!网络上搜索了半天,终于在一篇
StackOverflow
的帖子中看到了相关的解答:使用
alembic
,可实现动态加载类库的功能。具体方法如下:

project.clj
中引入
[alembic "0.3.2"]
或更高版本

lein repl


(require 'alembic.still)


(alembic.still/distill '[org.clojure/data.codec "0.1.0" :exclusions [org.clojure/clojure]])


其中
alembic.still/distill
可用兼容
project.clj
的语法来动态加载依赖的类库,然后就可以在后续的REPL中使用动态加载的类了。

找了方法后,为了方便后续的使用,我想修改
$HOME/bin/clojure
脚本。原来这个脚本是用来运行
java clojure.main
的:没有参数则进入
REPL
;否则将参数作为脚本文件名逐个执行。现在我希望用
lein repl
代替它,步骤如下:

$HOME/.lein/profiles.clj
中添加
exec-plugin
,用于将
.clj
文件作为脚本执行
{:user {:plugins [lein-exec "0.3.6"]}}


$HOME/.lein/repl
中新建工程(
lein new me.zzp/repl
),用于执行
lein repl
project.clj
如下
(defproject me.zzp/repl "1.0.0"
:description "Global Clojure REPL"
:dependencies [[org.clojure/clojure "1.8.0"]
[alembic "0.3.2"]]
:main ^:skip-aot me.zzp.repl)


me.zzp.repl
中添加一些自定义的函数或宏:
(ns me.zzp.repl
(:require alembic.still))

(defmacro dep [& args]
`(alembic.still/distill '[~@args]))

(defn -main [& args])


添加
$HOME/bin/clojure
脚本
#!/bin/sh

if [ $# -eq 0 ]; then
cd "$HOME/.lein/repl"
exec lein repl
else
exec lein exec "$@"
fi
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息