生活在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
相关文章推荐
- PHP图像处理类库MagickWand用法实例分析
- ExtJS 2.0实用简明教程 之Ext类库简介
- 理解Javascript文件动态加载
- javascript动态加载二
- JavaScript 动态加载脚本和样式的方法
- javascript面向对象包装类Class封装类库剖析
- 动态加载jQuery的两种方法实例分析
- 一个简单的动态加载js和css的jquery代码
- jquery select动态加载选择(兼容各种浏览器)
- 使用jquery动态加载javascript以减少服务器压力
- 一个简单Ajax类库及使用方法实例分析
- js 动态加载事件的几种方法总结
- javascript动态加载三
- JavaScript 应用类库代码
- ASP.net 动态加载控件时一些问题的总结
- 动态加载图片路径 保持JavaScript控件的相对独立性
- 多浏览器兼容的动态加载 JavaScript 与 CSS第1/2页
- Android 中动态加载.jar的实现步骤
- 实例讲解动态加载gridview中的行及其样式
- javascript动态加载实现方法一