9

假设我在net.aserveand之上构建了一个应用程序bordeaux-threads。我的包声明可能如下所示:

(defpackage :my-package
  (:use :cl :net.aserve :bordeaux-threads)
  (:export …))

我使用 Quicklisp,所以(ql:quickload "aserve") (ql:quickload "bordeaux-threads")在编译我的包之前我在 SLIME 中运行,一切都很好。

当然,明天我再次启动 SLIME,我必须记得QUICKLOAD在编译之前发出 s,否则我有麻烦了。

可以把类似的东西

(eval-when (:compile-toplevel)
  (ql:quickload "aserve")
  (ql:quickload "bordeaux-threads"))

在我的包的顶部——这是我为开发所做的——但我觉得将包管理器强加给用户并不是一个好主意。

有更好的选择吗?

4

4 回答 4

14

在您的 asd 文件中,您应该如下定义依赖项:''

(asdf:defsystem #:aserve
 :serial t
 :depends-on (#:hunchentoot :hunchentoot-cgi
           #::bordeaux-threads
           #:parenscript)
 ...)

之后你只需要 (ql:quickload :aserve) 。

于 2012-03-23T01:26:26.240 回答
11

使用quickproject(可通过 访问(ql:quickload :quickproject))为您的应用程序创建一个系统。如 z_axis 所述,然后您可以在defsystem声明中填写依赖项列表(如果您在调用 时遗漏了任何依赖项quickproject:make-project)。

如果您在local-projectsQuicklisp 安装路径中创建新项目,您也可以快速加载您的项目(即使它还不是 Quicklisp 发行版的一部分)。快速加载您的项目当然会下载依赖项(如果它们是 Quicklisp 发行版的一部分),然后加载它们。

于 2012-03-23T06:45:07.977 回答
3

如果您根本不想在部署的源代码中包含 quicklisp 调用,请将 quickproject 系统定义文件与源代码的其余部分分开。

在源代码的顶部,就在调用之前,为您的包依赖defpackage项添加必要的 's。(require ...)这保证了在继续之前(以某种方式)加载了这些 lisp 包,但没有指定“如何”加载这些包。它们可以通过运行ql:quickload :my-package调用(使用 quickproject)来加载,这将首先加载依赖项,然后在加载源代码时运行 require 调用。或者可能用户可以直接加载源(无需调用ql:quickload),并且依赖项将在 require 调用期间加载,如果这些依赖项可以在*module-search-path*. 正如您所说,这种技术将允许最终用户使用他/她想要加载您的源的任何构建工具。

对此进行了几分钟的试验后,quicklisp 似乎锁定到了 require 函数调用中,因此如果安装了 quicklisp,并且(require :bordeaux-threads)调用了例如,lisp 将使用 quicklisp 下载并安装该依赖项。这是一个非常好的特性(IMO),因为它允许 Common Lisp 标准require函数充当接口层,并抽象出用于满足依赖关系的特定构建工具。Quicklisp 可以锁定到 require,asdf 锁定到它(IIRC)等。

因此,要回答您的问题,quicklisp 调用不应在已部署的源代码中的任何位置进行,并且requires应用于确保在评估包定义文件之前加载依赖项。如果有人在加载包定义文件之前安装了 quicklisp,则可以通过使用 quicklisp 下载和安装依赖项来满足这些要求。如果有人安装了 asdf,那么这些依赖项将对该构建工具感到满意。如果有人已经安装了依赖项(使用其他技术),则要求将被简单地传递。

于 2013-05-29T18:56:10.513 回答
2

我有完全相同的问题,我同意我不应该强迫用户使用包管理器。在使用 quicklisp 之前,我使用 clbuild 并将所有 .asd 文件放入系统 / 目录中。只要 `systems/' 目录位于 asdf: central-registry中,至少在 SBCL 和 CCL 中,可以简单地(需要“a-package”)加载所有相关包。如果您从上游安装,新的 clbuild2 将保留此功能,并且其集成的 quicklisp 确实尊重从上游单独安装的软件包,但 quicklisp 安装的软件包不再公开它们的 .asd 文件。

所以我的解决方案是编写一个 shell 脚本来扫描所有已安装的 quicklisp 包,通常在 dists/quicklisp/software/ 下,并将所有 .asd 文件链接到一个中心位置。这样一来,如果只想使用已安装的 quicklisp 软件包,就不需要将 quicklisp 加载到 cl 映像中。我希望 quicklisp 可以默认提供这个功能。

于 2013-05-21T00:47:48.023 回答