使用ASDF启动Hunchentoot

9

我正在使用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个回答

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可执行文件即可。


3
您的示例对我有效,至少修改后可以与当前的Hunchentoot 1.0.0配合使用,但那只是将 (hunchentoot:start-server :port 8705) 改为 (hunchentoot:start (make-instance 'hunchentoot:acceptor :port 8705))
在任何情况下,虽然可能有可能性,但您真的不应该从ASDF加载的文件中运行东西。它类似于构建系统的角色,我认为让make启动一个Web服务器并不是很常见...
如需部署,请参见cl-launch、sbcl命令行选项,特别是--eval,或保存图像

1

请看这里:http://xach.livejournal.com/278047.html

我自己也是个新手,Zach Beane的博客文章把拼图放在了正确的位置。 他讲解了如何使用ASDF开始一个小项目,该放置什么,如何尝试以及如何构建成二进制文件。非常好的入门指南。

阅读完后,您将在.asd中使用“:serial t”,将Hunchentoot的启动移动到函数中,在REPL中尝试并为应用程序构建二进制文件。


1
我所做的是拥有一个文件,该文件加载我的Web应用程序的ASDF系统定义,然后使用一切设置好的Hunchentoot启动。然后使用sbcl --load start-stuff运行它。

0

这在大约三个不同的方面似乎有些可疑,而且它仍然没有回答为什么 ASDF 在我的情况下似乎会卡住自己(因为我仍然需要使用 ASDF,对吧?),但我会试一试。 - Ken

0

你应该避免在asd文件中放置任何逻辑。您可以将它们视为简单的makefile。您需要的是一种保存lisp镜像的方法,该镜像将在启动时启动服务器实例。

这取决于平台,因此您需要搜索Lisp实现文档。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接