【问题标题】:Using ASDF to start Hunchentoot使用 ASDF 启动 Hunchentoot
【发布时间】:2009-03-21 20:53:49
【问题描述】:

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

【问题讨论】:

    标签: lisp packages common-lisp startupscript hunchentoot


    【解决方案1】:

    从命令行运行 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 复制到clbuild.conf 并编辑clbuild.conf 以指向您要使用的Lisp 可执行文件。

    【讨论】:

      【解决方案2】:

      您的示例对我有用,至少修改为与当前的 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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

            • 这在大约 3 种不同的方面看起来很粗略,它仍然没有回答为什么 ASDF 似乎为我楔入了自己(因为我仍然需要使用 ASDF,对吗?),但我会给试试看。
            【解决方案6】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-03-28
              • 1970-01-01
              • 1970-01-01
              • 2019-10-22
              • 2018-06-03
              • 2022-01-06
              • 1970-01-01
              相关资源
              最近更新 更多