使用 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(或者“库”)。
Quicklisp 和 ASDF 的区别:
简单来说,ASDF 定义一个 system,这个 system 会有多个源码文件,这些文件之间存在依赖关系,比如 b.lisp 依赖 a.lisp,ASDF 就是用来解决这种依赖的。而 Quicklisp 除了自动管理 system,还可以解决 system 之间的依赖关系,比如 restas 依赖 hunchentoot,在安装 restas 时,也会自动安装 hunchentoot。
1. Quicklisp
通常你的 Common Lisp 实现中是没有自带 Quicklisp 的,所以需要去官方(http://www.quicklisp.org/beta/) 下载并手动安装。在官方网站找到 http://beta.quicklisp.org/quicklisp.lisp, 将它下载到本地,然后启动一个 Common Lisp 实现,并加载 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)
2. 安装在多个 Common Lisp 实现中
安装了一次 Quicklisp 之后,可以让它共享在系统里多种 Common Lisp 中,在其他 CL 实现中加载 Quicklisp:
(load "~/quicklisp/setup.lisp")
执行 ql:add-to-init-file,会自动把配置信息写入到对应的启动初始化文件中:
(ql:add-to-init-file)
重启 REPL 即可。