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"))))

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 をシェル スクリプトでラップすることです。スクリプトは、プログラム環境をセットアップし、コマンド ライン引数を渡す必要があります。通常、ランタイム コンテキストには、(ASD または LOAD-FILE を介して) ロードするアプリケーション ファイルと、評価する 1 つ以上のフォームまたは実行する関数が含まれます。

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 を実行しますが、(恥知らずなプラグ) Clozure CL (ccl)などの別の Lisp を実行するように構成するのは非常に簡単です。コピーclbuild.conf.defaultclbuild.confて編集clbuild.confし、使用したい Lisp 実行可能ファイルを指すようにします。

于 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ビルドシステムに似た役割を果たします.Webサーバーを起動することはまったく一般的ではないと思います...

展開については、 cl-launch、sbclコマンド ライン オプション、特に--eval、またはイメージの保存を参照してください。

于 2009-03-22T10:10:40.837 に答える
1

こちらをご覧ください: http://xach.livejournal.com/278047.html

私自身初心者ですが、Zach Beane のこのブログ投稿ではパズルのピースを配置しています。彼は、ASDF で小さなプロジェクトを開始する方法、何をどこに置くか、どのように試すか、バイナリとしてビルドする方法を説明しています。素晴らしいプライマー。

.asd で ":serial t" を使用することを読んだ後、Hunchentoot の開始を関数に移動し、REPL で試して、アプリケーションのバイナリをビルドします。

于 2013-10-30T07:27:12.750 に答える
1

私がやっていることは、Web アプリケーションの ASDF システム定義をロードするファイルを用意し、すべてをセットアップして Hunchentoot を開始することです。これは、sbcl --load start-stuff で実行されます。

于 2009-03-22T11:11:43.233 に答える
0

私はあなたよりも少ないことを知っていますが、このリンクは関連しているようです:http: //common-lisp.net/pipermail/tbnl-devel/2008-November/004455.html。どうやらSLIME(一種)で実行するだけでは、結局のところそれほどひどい考えではありません。「hunchentootの展開」のためにグーグルで見つけました。

于 2009-03-21T21:03:49.977 に答える