Использование ASDF для запуска Hunchentoot

Я работаю над веб-приложением, используя Hunchentoot (на SBCL и Linux), и обычно я просто запускаю его из 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))

сервер.лисп:

(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, несмотря на многочасовое чтение о них.)


person Ken    schedule 21.03.2009    source источник


Ответы (6)


Запуск приложений Lisp из командной строки

Многие (не все) реализации Лиспа поддерживают механизм сохранения образа (или сохранения мира, или дампа), который инкапсулирует тело кода и запускает функции при запуске. Как сказал другой автор, эти механизмы зависят от платформы и поставщика.

Большинство реализаций Лиспа (все?) имеют интерфейс командной строки. Таким образом, обычный подход к развертыванию приложения Lisp состоит в том, чтобы обернуть сценарий оболочки вокруг Lisp. Сценарий должен настроить программную среду и передать аргументы командной строки. Обычно контекст выполнения включает в себя файлы приложений для загрузки (через ASD или LOAD-FILE) и одну или несколько форм для оценки или функций для запуска.

Использование/расширение clbuild

Вы можете создать свой собственный сценарий или повторно использовать некоторые существующие технологии. Взгляните на clbuild, который полезен по нескольким причинам. (Подробнее о функциональности и переносимости clbuild см. ниже.)

Вы можете расширить clbuild для запуска собственного приложения с аргументами командной строки. Например, чтобы загрузить систему «myapps» и запустить функцию «myapp1:start», вы должны вызвать clbuild следующим образом:

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

Обратите внимание на синтаксис escape-символов для круглых скобок; это необходимо для большинства интерпретаторов команд.

Альтернативный подход — перенаправить стандартный ввод из файла. Например:

clbuild run any :myapps < commands.lisp

clbuild функциональность и портативность

clbuild чаще всего используется для установки и запуска библиотек CommonLisp с открытым исходным кодом.

Это bash-скрипт, поэтому он легко переносим. Средство загрузки зависит от таких программ, как CVS, Subversion, darcs, git и Mercurial.

По умолчанию clbuild запускает sbcl, но его очень легко настроить для запуска другого Лиспа, такого как (shameless plug) Закрытие CL (ccl). Скопируйте clbuild.conf.default в clbuild.conf и отредактируйте clbuild.conf так, чтобы он указывал на исполняемый файл Lisp, который вы хотите использовать.

person kmcorbett    schedule 31.03.2009

Ваш пример работает для меня, по крайней мере, модифицирован для работы с текущим Hunchentoot 1.0.0, но это просто изменение (hunchentoot:start-server :port 8705) на (hunchentoot:start (make-instance 'hunchentoot:acceptor :port 8705)).

В любом случае, хотя это и возможно, вы не должны запускать вещи из файлов, загружаемых ASDF. Он выполняет роль, аналогичную системе сборки, и я не думаю, что make запускает веб-сервер, это обычное дело...

Для развертывания см. cl-launch, sbcl параметры командной строки, в частности --eval или сохранение изображения.

person Ramarren    schedule 22.03.2009

Что я делаю, так это имею файл, который загружает определение системы ASDF для моего веб-приложения, а затем запускает Hunchentoot со всеми настройками, как это должно быть. Затем это запускается с помощью sbcl --load start-stuff.

person Vatine    schedule 22.03.2009

Посмотрите здесь: http://xach.livejournal.com/278047.html

Я сам новичок, и этот пост в блоге Зака ​​Бина расставляет кусочки головоломки по местам. Он объясняет, как начать небольшой проект с ASDF, что куда поставить, как попробовать и как собрать его как бинарный файл. Отличный праймер.

Прочитав, что вы будете использовать «:serial t» в .asd, переместите запуск Hunchentoot в функцию, попробуйте его в REPL и создайте двоичный файл для своего приложения.

person peroksid    schedule 30.10.2013

Я знаю еще меньше, чем вы, но эта ссылка кажется актуальной: http://common-lisp.net/pipermail/tbnl-devel/2008-November/004455.html. По-видимому, просто запустить его в SLIME (вроде как) не такая уж и плохая идея. Нашел по запросу "развертывание hunchentoot".

person Logan Capaldo    schedule 21.03.2009
comment
Это кажется схематичным примерно с трех разных точек зрения, и это все еще не объясняет, почему ASDF кажется мне заклинивающим (ведь мне все еще нужно использовать ASDF, верно?), но я попробую. - person Ken; 22.03.2009

Вам следует избегать размещения какой-либо логики в файлах asd. Вы можете обращаться с ними как с простыми make-файлами. Что вам нужно, так это способ сохранить образ lisp, который будет запускать экземпляр вашего сервера при запуске. Это зависит от платформы, вам нужно будет найти документацию по реализации lisp.

person Marko    schedule 23.03.2009