というタイトルの通りのことを目指して、現在OCamlとOcsigenというWebアプリケーションフレームワークでWebアプリケーションを作ってみようと思ってます。
ちなみにこのOCamlとOcsigenというのはかなり癖のある環境で、私は今のところDebian上でしかOcsigenまで含めた環境構築ができてません。
WindowsはOCamlの環境として、必須となるようなライブラリ群もインストールにかなり手間取るのでやめた方がいいです。(正直、挫折必至)
Macでもhomebrewによるインストールでかなり問題なさそうでしたが、ネイティブ用のコンパイル時にいくつかのライブラリでこけました。macportsは試していないのと、普通にインストールした場合を知らないのですが、homebrewでのインストールはいくつかのライブラリを使う場合(今回のOcsigenを含めて)、難しいです。。。
追記:
もしかすると、Macの場合はOCamlのバイナリインストール(dmgファイルによる)を行った方がいいかもしれません。まだOcsigenのインストールは試していませんが…。
さらに追記:
試したところ、MacではOCamlをソースからビルドしてインストールしたものが最も安定するようです。まだOcsigenの(ry
そこで今回はかなりうまく成功したDebian上での開発をメインに書いておきます。
OCamlとOCsigenのインストール
まずはインストールですが、http://ocsigen.org/install に書いてある通りでほぼいいですが、追加でgdbmが必要です。なので./configure を実行する前に
aptitude install libgdbm-dev
を実行しましょう。
これで./configureを実行して、makeを実行した際に失敗する場合は
./configure --with-ocaml
で./configureを実行してからmakeしてみましょう。
これでインストールできなかったら、自力でなんとかする。(といいつつ、現状ほかの環境では何ともなってない。)
最後にmake installしたら、
ocamlfind list | egrep 'lwt|js_of_ocaml|ocsigenserver|eliom'
でocamlfindにlwt、js_of_ocaml、ocsigenserver、eliomがインストールできているか確かめてみる。
Ocsigen ServerとEliomでHello World
初めてと言えばHello WorldということでHello Worldを実装してみました。
Githubにコードを上げたのでリンクをば。 https://github.com/naokirin/Eliom_examples
~.confというサーバー実行時に読み込む設定ファイルと、モジュールとなる~.cmo(もしくはcma)ファイルが必要になるようです。
まずはモジュールとなるhelloworld.mlファイルを見ます。
open Lwt open Eliom_pervasives open HTML5 open Eliom_services open Eliom_parameters open Eliom_output.Html5 let main_service = register_service ~path:["hello"] ~get_params:unit (fun () () -> return (html (head (title (pcdata "helloworld")) []) (body [h1 [pcdata "Hello, World"]])))
register_service に ~path でurlを指定します。上の例では http://localhost:8080/hello になっています。
もっと深い階層にしたい場合は ~path:["foo"; "bar"] 等にすれば、 http://localhost:8080/foo/bar になります。
また~get_paramsはurlでパラメータを受け取るときに使うもので、受け取らない場合はunitを指定します。
helloworld.conf内は
<ocsigen> <server> <port>8080</port> <logdir>./log</logdir> <datadir>./data</datadir> <user>naoki</user> <group>naoki</group> <commandpipe>/tmp/ocsigen_command</commandpipe> <charset>utf-8</charset> <findlib path="/usr/local/lib/ocaml/3.12.1"/> <extension findlib-package="ocsigenserver.ext.staticmod"/> <extension findlib-package="ocsigenserver.ext.ocsipersist-sqlite"> <database file="./db/file"/> </extension> <extension findlib-package="eliom.server"/> <host charset="utf-8" hostfilter="*"> <site path=""> <eliom module="./helloworld.cma" /> </site> </host> </server> </ocsigen>
のようになっています。
あとは実行するモジュールとして
ちなみに
これであとはコンパイルとサーバーを起動すれば、実行することができます。
まずはコンパイルです。
ocamlfind ocamlc -thread -package eliom.server -c helloworld.ml ocamlfind ocamlc -thread -package eliom.server -a helloworld.ml -o helloworld.cma
そのあと必要となる、data、log、dbディレクトリを作成して、db下にfileを作成します。
mkdir data log db touch db/file
そしてocsigenserverを起動します。
ocsigenserver -c helloworld.conf
これで http://localhost:8080/hello にアクセスすれば、Hello, Worldが見れるはずです。