Quicklisp QUICKLOAD在我的源代码中应该放在哪里?哪里都没有?

Quicklisp QUICKLOAD在我的源代码中应该放在哪里?哪里都没有?,lisp,common-lisp,quicklisp,allegro-cl,Lisp,Common Lisp,Quicklisp,Allegro Cl,假设我在net.aserve和bordeaux线程之上构建了一个应用程序。我的包声明可能如下所示: (defpackage :my-package (:use :cl :net.aserve :bordeaux-threads) (:export …)) 我使用Quicklisp,所以在编译包之前,我在SLIME中运行(ql:quickload“aserve”)(ql:quickload“bordeaux threads”),一切正常 当然,明天我会再次启动SLIME,我必须记住在编译

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

(defpackage :my-package
  (:use :cl :net.aserve :bordeaux-threads)
  (:export …))
我使用Quicklisp,所以在编译包之前,我在SLIME中运行
(ql:quickload“aserve”)(ql:quickload“bordeaux threads”)
,一切正常

当然,明天我会再次启动SLIME,我必须记住在编译之前发出
QUICKLOAD
s,否则我会遇到麻烦

我可以说

(eval-when (:compile-toplevel)
  (ql:quickload "aserve")
  (ql:quickload "bordeaux-threads"))
在我的软件包的顶部,这是我为开发所做的,但我觉得将软件包管理器强加给用户不是一个好主意


有更好的替代方案吗?

在asd文件中,您应该按如下方式定义依赖关系:“”

然后,您只需要(ql:quickload:aserve)。

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


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

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


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

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

在源代码顶部,在调用
defpackage
之前,为包依赖项添加必要的
(require…
)。这保证了这些lisp包在继续之前(以某种方式)被加载,但没有指定这些包的加载方式。可以通过运行
ql:quickload:my package
调用(使用quickproject)来加载它们,该调用将首先加载依赖项,然后在加载源时运行require调用。或者,用户可以直接加载源代码(无需调用
ql:quickload
),如果可以在
*模块搜索路径*
上找到依赖项,则依赖项将在require调用期间加载。正如您所说,这种技术将允许最终用户使用他/她想要加载您的源代码的任何构建工具

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


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

能否将其放入.clinit.cl文件中?看。@JohnPick我可以,虽然我没有运行Allegro CL,但SBCL可能有一个等价物。(事实上,
.sbclrc
)我想这可能是我最好的选择——我有一种感觉,不知何故,我不得不在每一家初创公司上运行它,这是一种遗憾,但我内心深处的某种想法告诉我,我所寻找的东西根本没有意义,因此我猜问题标题中出现了“无处可去”的字样!我不是在写
aserve
,我是在尝试使用它,只是手动运行
(ql:quickload:aserve)
,这是我试图避免的@ArlenCuss:只需将
aserve
添加到依赖项列表中,如
hunchentoot
bordeaux threads
,然后当您加载(或快速加载)此系统时,它将加载依赖项。实际上,Quicklisp基本上就是这么做的,它使用ASDF并下载缺少的依赖项;被接受的答案是另一个问题的答案(我不确定确切的答案是什么)。@Xach:我被纠正了。公认的答案似乎达到了我的目的。我还不知道ASDF是什么,所以z_axis对“[my]asd文件”的引用让我大吃一惊。我来看看这是怎么回事!正如z_轴所暗示的(?),只要
.asd
在同一目录中,我就可以快速加载它
(asdf:defsystem #:aserve
 :serial t
 :depends-on (#:hunchentoot :hunchentoot-cgi
           #::bordeaux-threads
           #:parenscript)
 ...)