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)
...)