Использование ASDF для запуска Hunchentoot - PullRequest
8 голосов
/ 21 марта 2009

Я работаю над веб-приложением, использующим 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"))))

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 голосов
/ 31 марта 2009

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

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

Большинство реализаций 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 чаще всего используется для установки и запуска библиотек CommonLisp с открытым исходным кодом.

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

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

3 голосов
/ 22 марта 2009

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

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

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

1 голос
/ 22 марта 2009

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

0 голосов
/ 30 октября 2013

Взгляните сюда: http://xach.livejournal.com/278047.html

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

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

0 голосов
/ 23 марта 2009

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

0 голосов
/ 22 марта 2009

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

...