就像这里的一些问题,我是Lisp的新手.我正在阅读Practical Common Lisp一书,但是稍微看了一下设置一个Web应用程序是多么容易,所以我一直在关注这个教程,以及这里的更新版本.
当我到达启动服务器的位置时,我的REPL就会死掉,然后我无法将任何东西推到服务器上*dispatch-table*.
所以基本上,我的代码在REPL中工作得很好,将对象添加到列表中,检索它们等等,然后我启动服务器使用
(setf *web-server* (start (make-instance 'hunchentoot:acceptor :port 8080)))
Run Code Online (Sandbox Code Playgroud)
哪个很好用,我可以访问它http://localhost:8080.但是当我访问它时,日志会打印到REPL,从那时起我无法实际使用REPL.例如,在Adam Petersen的帖子之后,我不能那么做
(push (create-prefix-dispatcher "/retro-games.htm" 'retro-games) *dispatch-table*)
Run Code Online (Sandbox Code Playgroud)
因为REPL没有反应.我尝试从不同的窗口(即从终端的SBCL)启动服务器但是它不知道我所处的上下文 - 它不理解我正在处理的包或我的任何代码.
我使用的是略微非标准的设置; 我在OSX上使用Sublime Text 2和SublimeREPL和SBCL(因为我真的没有进入Emacs和ST2很棒!).我描述我是如何把它一起在这里 -但我真的只张贴的以防万一,我会感到惊讶,如果它是我的设置造成的问题,而不是我失去了一些基本的东西.
无论如何,我知道我可以继续在更像生产的环境中设置hunchentoot,并且已经看到一些详细说明并远程访问REPL的帖子,但是我希望有一些更简单的东西可以解决我的问题.我错过了.
我想知道如何部署一个用Hunchentoot,Wookie,Woo甚至Clack编写的Common Lisp Web应用程序.
也就是说,假设我编写了一个包含一些文件,软件包等的应用程序.通常,当我在本地工作时,我只需在REPL中运行一个启动服务器的命令,然后使用localhost:8000或类似的方式访问它.
但是,对于将应用程序部署到AWS EC2等生产服务器的过程,我感到有些疑惑.我应该以什么形式部署Lisp代码?有不同的选择吗?如果需要重新启动服务器或遇到问题,会发生什么?
Hunchentoot文档说明:
"ACCEPTOR的方法尝试提供相对于它的ACCEPTOR-DOCUMENT-ROOT的静态文件."
acceptor-document-root acceptor =>(或pathname null)
(setf(acceptor-document-root acceptor)new-value)
我在将这个文档翻译成实际的Lisp代码时遇到了麻烦.
有人可以给我一个例子,告诉我如何告诉Hunchentoot在哪里寻找静态网页服务?
我开始使用SBCL Common Lisp并希望使用Hunchentoot开发一个小型Web应用程序.为了便于部署,我计划使用sb-ext:save-lisp-and-die将所有内容保存在二进制文件中,因为我可以使用大输出大小.
对于可执行文件,您需要提供顶级功能.问题是当顶级函数返回时程序退出.我试图从可执行文件启动Hunchentoot,但程序在两秒后结束.
在停止程序之前,我怎么能等到Hunchentoot关闭(从请求内部)?我可以加入Hunchentoot接受器线程吗?或者我甚至可以将REPL包含在可执行文件中以便能够进行实时调试?
我正在使用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"))))
Run Code Online (Sandbox Code Playgroud)
package.lisp:
(defpackage myapp
(:use :cl))
Run Code Online (Sandbox Code Playgroud)
server.lisp:
(setq hunchentoot:*dispatch-table*
(list (hunchentoot:create-static-file-dispatcher-and-handler "/foo" "foo")))
(hunchentoot:start-server :port 8705)
Run Code Online (Sandbox Code Playgroud)
如果我尝试手动加载:
$ sbcl
* (require 'asdf)
* (asdf:operate 'asdf:load-op 'myapp)
Run Code Online (Sandbox Code Playgroud)
它加载并编译了一大堆函数,但随后就停止了.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.
Run Code Online (Sandbox Code Playgroud)
有没有办法让这项工作?(忏悔:我真的不太了解ASDF或Common Lisp包,尽管有很多时间阅读它们.)
有没有人能够使用Hunchentoot使用Heroku Common Lisp Buildpack在Heroku上成功部署应用程序?
我得到了一个
! Heroku push rejected, no Cedar-supported app detected
Run Code Online (Sandbox Code Playgroud)
而且我不确定我做错了什么,或者是否还没有支持
更新:
上述错误是由于缺少heroku-setup.lisp文件.Heroku现在接受推送,但尝试访问该网站会出错.
Mike Travers回答了这个问题:" 不,它目前不支持Hunchentoot,但要添加它并不难. "
我想现在的问题仍然是谁能够添加该功能?
我发现在编写Hunchentoot时,增量开发往往会中断.
例如,我可能会编写一个由几个函数组成的网页.如果其中一个内部函数包含调用 - 比如 - hunchentoot:post-parameters*那么我就不能轻易地在REPL中测试该函数.它会出错,因为*request*不存在,除非Web客户端调用该页面.
如果存在一些函数或其他源,那么我可以测试我的函数:
>(let* ((*request* (get-previous-request-from-somewhere))
(*session* (slot-value *request* 'hunchentoot:session)))
(my-function <whatever params>))
Run Code Online (Sandbox Code Playgroud)
它或类似的东西存在吗?我是否忽略了更好的调试方法?
如果您不关心并且只想查看问题,这里的背景故事会跳到底部.
所以我在LISP玩了一会儿.一些基本功能,一些类和文件IO.当我遇到这篇文章时:
http://www.adampetersen.se/articles/lispweb.htm
我很高兴尝试将lisp用于Web应用程序.我去下载软件包,但是对于我的生活,我不知道如何将它们加载到我的Allegro IDE中.
嗯......好吧,hunchentoot网站说很多基本软件包都在LispWorks中.所以我下载了.仍然不确定如何获取我下载到这些IDE中的软件包的源代码.他们似乎有包的二进制文件?
哦,也许生病切换到我的ubuntu服务器和apt-获取所有软件包和设置粘液(我之前没有使用它因为我只是想学习lisp.同时学习emacs和lisp似乎真的令人生畏).我倾向于获得所需的所有软件包并加载粘液,并且再次出现同样的问题.
我挖了一些更多,看到这个程序叫做ASDF.看起来ASDF是lisp的某种包构建器?我不知道这看起来有点令人困惑.我现在就要放弃了.
如果你还在读这里,这是我的问题.
1.如何将这些包的源加载到我的lisp环境中.尝试学习lisp并不是太难,但有关环境的信息却很少.我是否需要构建我使用ASDF下载的软件包.
2.有没有一种简单的方法可以让人们在lisp中启动并运行,而无需提前大量学习所有工具?
如何在项目中启动 Hunchentoot?我查看了 Edi Weitz 的指南,一切都很顺利,直到安装完成。列出的教程要么不完整,要么略过实际服务器使用情况。
我有我的 asdf 文件,使用 quicklisp 安装了依赖项,并设置了一个调度表。我如何让 Hunchentoot 使用这些东西?
我在 hunchentoot 上启用 CORS 时遇到一些问题:
(hunchentoot:define-easy-handler (one-api :uri *one-endpoint*) ()
(when (boundp '*acceptor*)
(setf (hunchentoot:header-out "Access-Control-Allow-Origin") "*")
(setf (hunchentoot:header-out "Accept") "*/*")
(setf (hunchentoot:header-out "Access-Control-Allow-Headers") "Content-Type, Accept, Origin")
(setf (hunchentoot:header-out "Access-Control-Allow-Methods") "POST, GET, OPTIONS, PUT, DELETE")
(setf (hunchentoot:header-out "Access-Control-Allow-Origin") "*")
(setf (hunchentoot:content-type*) "text/html"))
(let* ((raw-data (hunchentoot:raw-post-data :force-text t)))
(funcall callback raw-data))))
Run Code Online (Sandbox Code Playgroud)
但还是不行,是我哪里做错了吗?
hunchentoot ×10
common-lisp ×9
lisp ×7
packages ×2
sbcl ×2
amazon-ec2 ×1
debugging ×1
executable ×1
heroku ×1
sublimetext2 ×1
webserver ×1