8

我正在使用 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"))))

包.lisp:

(defpackage myapp
  (:use :cl))

服务器.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 包,尽管阅读了很多小时。)

4

6 回答 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,例如(shameless plug) Clozure CL (ccl)。复制并编辑clbuild.conf.default以指向您要使用的 Lisp 可执行文件。clbuild.confclbuild.conf

于 2009-03-31T19:38:05.750 回答
3

您的示例对我有用,至少修改为可以与当前的 Hunchentoot 1.0.0 一起使用,但这只是更改(hunchentoot:start-server :port 8705)(hunchentoot:start (make-instance 'hunchentoot:acceptor :port 8705)).

在任何情况下,尽管可能,您实际上不应该从 ASDF 加载的内部文件中运行东西。它的作用类似于构建系统,我认为make启动网络服务器并不常见......

对于部署,请参见cl-launch、 sbcl命令行选项,特别是--eval,或保存图像

于 2009-03-22T10:10:40.837 回答
1

我要做的是创建一个文件,为我的 Web 应用程序加载 ASDF 系统定义,然后启动 Hunchentoot 并按照应有的方式设置所有内容。然后使用 sbcl --load start-stuff 运行。

于 2009-03-22T11:11:43.233 回答
1

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

我自己也是个新手,Zach Beane 的这篇博客文章将拼图放在了一些地方。他解释了如何使用 ASDF 启动一个小项目、放置什么、如何尝试以及如何将其构建为二进制文件。伟大的底漆。

读完你将在 .asd 中使用 ":serial t" 之后,将启动 Hunchentoot 移动到一个函数,在 REPL 中尝试它并为你的应用程序构建一个二进制文件。

于 2013-10-30T07:27:12.750 回答
0

您应该避免将任何逻辑放在 asd 文件中。您可以将它们视为简单的 makefile。您需要的是一种保存 lisp 图像的方法,该图像将在启动时启动您的服务器实例。这取决于平台,您需要搜索您的 lisp 实现文档。

于 2009-03-23T12:35:33.957 回答
0

我知道的比你还少,但这个链接似乎很相关:http ://common-lisp.net/pipermail/tbnl-devel/2008-November/004455.html 。显然只是在 SLIME 中运行它(有点)毕竟不是一个糟糕的主意。通过谷歌搜索“部署 hunchentoot”找到。

于 2009-03-21T21:03:49.977 回答