使用 Quicklisp 管理三方库
Table of Contents
Quicklisp 是 Common Lisp 平台的包管理器,类似于 Python 中的 pip。目前官方已收录了 1000 个以上的三方库(可见 Common Lisp 的库并不少),多数包都可以运行在多种 Common Lisp 的实现上。
术语:
- package:Common Lisp 中的 package 可理解成命名空间,详细请参考:http://acl.readthedocs.org/en/latest/zhCN/ch14-cn.html#packages。
- system:类似 Python 中的 module 概念。但”system“这个术语在 Common Lisp 标准中没有被提及,它是一些三方的定义,比如 ASDF。LispWorks 这些商业实现有自己的 system 实现。
- library:目前把用 ASDF 定义的 system 可以说成是“库”,所以 Quicklisp 安装的就是第三方 system(或者“库”)。
1. Quicklisp 和 ASDF 的区别
简单来说,ASDF 定义一个 system,这个 system 会有多个源码文件,这些文件之间存在依赖关系,比如 b.lisp 依赖 a.lisp,ASDF 就是用来解决这种依赖的。而 Quicklisp 除了自动管理 system,还可以解决 system 之间的依赖关系,比如 restas 依赖 hunchentoot,在安装 restas 时,也会自动安装 hunchentoot。
2. 使用 Quicklisp
通常你的 Common Lisp 实现中是没有自带 Quicklisp 的,所以需要去官方(http://www.quicklisp.org/beta/) 下载并手动安装。在官方网站找到http://beta.quicklisp.org/quicklisp.lisp 这个链接,这是安装文件,将它下载到磁盘的任意一个位置(比如/tmp),然后启动一个 Common Lisp 实现,并用它 load 下载回来的 quicklisp.lisp,比如在 SBCL 里:
$ sbcl --load quicklisp.lisp
然后在 REPL 中安装 Quicklisp:
(quicklisp-quickstart:install)
接着需要让 SBCL 启动的时候自动加载 Quicklisp,这样才可以随时用 Quicklisp 安装三方库:
(ql:add-to-init-file)
完毕之后就可以用 Quicklisp 来安装三方库了,这里列举了全部的库名: http://www.quicklisp.org/beta/releases.html 。要安装哪个库,在 REPL 下调用 ql:quickload 函数即可,Quicklisp 会自动下载并 load 这个库的。比如安装 restas:
(ql:quickload "restas")
如果要搜索某个包,比如要搜索 MongoDB 相关的包,使用 ql:system-apropos 函数:
(ql:system-apropos "mongo")
#<SYSTEM cl-mongo / cl-mongo-20131003-git / quicklisp 2014-05-25>
#<SYSTEM cl-mongo-id / cl-mongo-id-20130128-git / quicklisp 2014-05-25>
#<SYSTEM twitter-mongodb-driver / cl-twitter-20131003-git / quicklisp 2014-05-25>
要卸载库,调用 ql:uninstall。如卸载 restas:
(ql:uninstall "restas")
调用 ql:update-all-dists 可以升级本地已安装的库:
(ql:update-all-dists)
3. 安装在多个 Common Lisp 实现中
安装了一次 Quicklisp 之后,可以让它共享在系统里多种 Common Lisp 中。
启动其他不支持 Quicklisp 的 Common Lisp 实现,然后加载 Quicklisp:
(load "~/quicklisp/setup.lisp")
执行 ql:add-to-init-file,将 Quicklisp 的配置信息写入到相应实现的启动初始化脚本中:
(ql:add-to-init-file)
然后重启 REPL 即可。