使用ASDF启动Hunchentoot

时间:2009-03-21 20:53:50

标签: lisp packages common-lisp startupscript hunchentoot

我正在使用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包,尽管有很多时间阅读它们。)

6 个答案:

答案 0 :(得分:4)

从命令行运行Lisp应用程序

许多(并非所有)Lisp实现都支持保存图像(或保存世界或转储)机制,该机制将封装一组代码并在启动时运行函数。正如另一张海报所说,这些机制是平台和供应商特定的。

大多数Lisp实现(全部?)都有一个命令行界面。因此,部署Lisp应用程序的传统方法是围绕Lisp包装shell脚本。该脚本必须设置程序环境并传递命令行参数。通常,运行时上下文包括要加载的应用程序文件(通过ASD或LOAD-FILE)以及要评估或运行的一个或多个表单。

使用/扩展clbuild

您可以滚动自己的脚本,也可以重复使用某些现有技术。看看clbuild,这有几个原因是有用的。 (有关clbuild功能和可移植性的更多信息,请参见下文。)

您可以使用命令行参数扩展clbuild以运行您自己的应用程序。例如,要加载“myapps”系统并运行“myapp1:start”函数,您将按如下方式调用clbuild:

clbuild run any :myapps "\\(myapp1:start 1 2 3\\)"

注意括号的字符转义语法;大多数命令解释器都需要这个。

另一种方法是从文件重定向标准输入。例如:

clbuild run any :myapps < commands.lisp

clbuild功能和可移植性

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,特别是--evalsaving 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中尝试并为你的应用程序构建一个二进制文件。