我正在使用Hunchentoot(在SBCL和Linux上)开发Web应用程序,通常我只是从Emacs(SLIME)运行它,但是为了部署,我想要一些更容易自动化的东西。所以我想弄清楚ASDF,因为这似乎是每个人现在都在使用的东西。
myapp.asd:
(in-package #:asdf)
(defsystem :myapp
:name "my app"
:depends-on ("hunchentoot")
:components ((:file "package")
(:file "server" :depends-on ("package"))))
package.lisp:
(defpackage myapp
(:use :cl))
server.lisp:
(setq hunchentoot:*dispatch-table*
(list (hunchentoot:create-static-file-dispatcher-and-handler "/foo" "foo")))
(hunchentoot:start-server :port 8705)
如果我尝试手动加载它:
$ sbcl
* (require 'asdf)
* (asdf:operate 'asdf:load-op 'myapp)
它加载并编译了一大堆函数,但随后就停止了。 Hunchentoot未运行,提示符不接受输入。我不知道它认为它处于什么状态:打印的最后一行是:
STYLE-WARNING: Implicitly creating new generic function STRINGIFY-COOKIE.
STYLE-WARNING: Implicitly creating new generic function DISPATCH-REQUEST.
STYLE-WARNING: Implicitly creating new generic function WRITE-HEADER-LINE.
有没有办法让这项工作? (忏悔:我真的不太了解ASDF或Common Lisp包,尽管有很多时间阅读它们。)
答案 0 :(得分:4)
许多(并非所有)Lisp实现都支持保存图像(或保存世界或转储)机制,该机制将封装一组代码并在启动时运行函数。正如另一张海报所说,这些机制是平台和供应商特定的。
大多数Lisp实现(全部?)都有一个命令行界面。因此,部署Lisp应用程序的传统方法是围绕Lisp包装shell脚本。该脚本必须设置程序环境并传递命令行参数。通常,运行时上下文包括要加载的应用程序文件(通过ASD或LOAD-FILE)以及要评估或运行的一个或多个表单。
您可以滚动自己的脚本,也可以重复使用某些现有技术。看看clbuild,这有几个原因是有用的。 (有关clbuild功能和可移植性的更多信息,请参见下文。)
您可以使用命令行参数扩展clbuild以运行您自己的应用程序。例如,要加载“myapps”系统并运行“myapp1:start”函数,您将按如下方式调用clbuild:
clbuild run any :myapps "\\(myapp1:start 1 2 3\\)"
注意括号的字符转义语法;大多数命令解释器都需要这个。
另一种方法是从文件重定向标准输入。例如:
clbuild run any :myapps < commands.lisp
clbuild最常用于安装和运行开源CommonLisp库。
它是一个bash脚本,所以它非常便携。下载工具依赖于CVS,Subversion,darcs,git和Mercurial等程序。
默认情况下,clbuild运行sbcl,但很容易将其配置为运行另一个Lisp,例如(无耻插件) Clozure CL (ccl)。将clbuild.conf.default
复制到clbuild.conf
并编辑clbuild.conf
以指向您要使用的Lisp可执行文件。
答案 1 :(得分:3)
您的示例适用于我,至少已修改为适用于当前的Hunchentoot 1.0.0,但这只是将(hunchentoot:start-server :port 8705)
更改为(hunchentoot:start (make-instance 'hunchentoot:acceptor :port 8705))
。
在任何情况下,尽管可能,您并不应该从ASDF加载的文件内部运行。它起着类似于构建系统的作用,我认为make
启动网络服务器并不常见......
有关部署,请参阅cl-launch,sbcl command-line options,特别是--eval
或saving an image。
答案 2 :(得分:1)
我所做的是拥有一个为我的Web应用程序加载ASDF系统定义的文件,然后启动Hunchentoot,其中包含应该设置的所有内容。然后使用sbcl --load start-stuff运行。
答案 3 :(得分:0)
我知道甚至比你少,但这个链接似乎很相关:http://common-lisp.net/pipermail/tbnl-devel/2008-November/004455.html。显然,只是在SLIME(有点)中运行它毕竟不是一个糟糕的主意。通过谷歌搜索“部署hunchentoot”。
答案 4 :(得分:0)
您应该避免在asd文件中放入任何逻辑。您可以将它们视为简单的makefile。您需要的是一种保存lisp映像的方法,它将在启动时启动您的服务器实例。 这取决于平台,您需要搜索lisp实现文档。
答案 5 :(得分:0)
看看这里:http://xach.livejournal.com/278047.html
我自己就是新手,Zach Beane的这篇博文将拼图放在了一些地方。 他解释了如何使用ASDF开始一个小项目,放在哪里,如何尝试以及如何将其构建为二进制文件。很棒的入门书。
在阅读之后,你将在.asd中使用“:serial t”,将Hunchentoot启动到一个函数,在REPL中尝试并为你的应用程序构建一个二进制文件。