Common LispでWebAppの開発に必要なN個のこと
PerlでWebAppの開発に必要なN個のこと - Islands in the byte streamのCommon Lisp版です。
あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずCommon Lispについて知っていることを書いた。←ここまで引用
Perl版と異なるのは、これは昔よく使われていたけど今は使うべきじゃないみたいなのも書きました。
パッケージマネージャ
Quicklispを使います。Common Lispで開発しようと思ったら処理系の次にこれが必要です*1。ここ数年のCommon Lispの環境変化はQuicklispに依るところがとても大きいです。
ライブラリごとにバージョンの管理をする機能は今のところ無いけれど、以下の記事でShellyを使ってQuicklisp自身をプロジェクトごとに分離することはできました。
※追記 (2014/10/21): qlotというプロジェクトローカルにQuicklispを分離できるツールを作りました。→ プロジェクトのCommon Lispライブラリ管理ツール「qlot」を作りました - 八発白中
アプリケーションサーバ
WebサーバへのインターフェイスとしてClackが使えます。今サポートしているバックエンドはHunchentoot、Apache2、FastCGIの3つです。*2
Clackを使うメリットは、アプリケーションを変更することなく環境によってWebサーバを使い分けることができるということです。開発時はセットアップの楽なHunchentootを使っておいて、本番ではnginxをフロントに置いてFastCGIで運用するのが最もパフォーマンスが良いです。
他には、Hunchentootを生で使う派も存在します。teepeedee2という最速を謳うWebサーバもありますが、使ったことがないのでわからないです*3。開発も止まっているみたいだし使わなくてもよさそうです。Hunchentootをさらにダイエットさせたtootというサーバもありますが、リリース当初使ったときにあまり品質が良くなかったのでそれから使っていません。今はどうか知らないです。
最近Wookieという非同期型のWebサーバが出てきました。cl-asyncの作者が作っていて、個人的には注目しています。9月10日現在はQuicklisp申請中。
データベース
Common LispではCL-DBIというライブラリがRDBMSへのインターフェイスです。実態はcl-mysqlとcl-postgresqlとsqliteを同じインターフェイスで使えるようにするというライブラリです。
CL-DBIのラッパーやSQLの生成ライブラリは存在しないので、自分でSQLを書く必要があります *4。
その他、Common LispではObjectStoreが好まれるのかライブラリが多いです。CLSQL、Elephant、Rucksack、AllegroCache (商用)など。AllegroCacheは使ったことがないのでわからないけど、個人的にはその他3つはあまりおすすめしません。品質が悪い。
ビューのレンダリング
テンプレートエンジンは2種類あって、HTMLをベースに拡張言語で書くものか、S式からHTMLを生成するものがあります。
HTMLをベースにするものはCL-EMBとcl-closure-templateが良さそう。どちらも一長一短があります。
- http://common-lisp.net/project/cl-emb/
- common-lisp - HTML内にコードを埋め込めるテンプレートエンジン「CL-EMB」 - Qiita
- https://code.google.com/p/cl-closure-template/
- common-lisp - Closure TemplateをCommon Lispで利用できるライブラリ「CL-Closure-Template」 - Qiita
S式から生成するものは、CL-WHOが良く使われています。もっとわかりやすいインターフェイスを目指してCL-Markupというものもあります。
HTTPクライアント
Drakmaくらいかな。HTTPSが必要無いならtrivial-httpというライブラリも使えます。
テストフレームワーク
大量にあって、どれが代表的だとは言いづらい状況。
観測範囲ではFiveAMが一番人気があり、その後継を謳うEosも使われるようになってきているようです。
※追記 (2014/10/21):
現在ではEosは非推奨になり、FiveAMの利用が推奨されています。
僕はTAP (Test Anything Protocol) で出力してほしいので、CL-TEST-MORE*5を使っています。今調べたらtestbildというのもTAPで出力してくれるそう。