末尾に追記あり
モチベーション
vibe.dはD言語で使えるまともなNon Blocking IO and Webフレームワークだが,一つ問題があってフレームワーク色が強すぎる.TornadoのようにIOStreamだけ使って華麗にライブラリを書くということが今は出来ないし,そもそもlibvibedのようなものを提供してない.
が,今現在Windowsで動くことも含めNon Blocking IOのライブラリを書くのは骨が折れるし出来れば楽したいので,vibe.dを使えるようなんとかする.
vibe.dアプリの動かし方
vibe.dはサーバの起動にvibeというコマンドを使う.これは必要になるlibeventやlibsslなどをオプションとして追加し,ローカルにあるpackage.jsonなどを読み込んでvibe.dアプリを起動する.これがライブラリとして使う時には使えないので,なんとかする.が,今のところ綺麗にどうこうする方法が思いつかないので,全部ライブラリに同梱するのが吉.
vibe.dアプリの起動シーケンス
HTTPサーバの例を見るとわかるが,サーバのようなvibe.dアプリはshared static this
を使って実行する.shared static this
で起動とか気持ち悪いし,こんなのライブラリの場合はやってられない.なんでこれで動くのかというと,import vibe.d;
をするとvibe.appmain.d
がさらにimportされる.実はこのvibe.appmain.d
が中にvibe.d用のmainを定義していて,すべてのセットアップが終わったらこれが呼ばれるようになっている.
vibe.dではグローバル変数を使って情報をやりとりしているのでこんな芸当が出来るわけだが,まぁやめてほしい.なので,ライブラリとして使う場合はvibe.appmain.d
とvibe.d.d
の二つを消すしかない.
vibe.dを普通に起動する
やることは以下のように,vibe.appmain.d
がやってることを自分でやってやれば良い.HTTPサーバの例は以下のようになる.
import vibe.vibe;
void handleRequest(HttpServerRequest req, HttpServerResponse res)
{
res.writeBody(cast(ubyte[])"Hello, World!", "text/plain");
}
void main()
{
auto settings = new HttpServerSettings;
settings.port = 8080;
setLogLevel(LogLevel.None);
listenHttp(settings, &handleRequest);
startListening();
runEventLoop();
}
もしこれをhttp_server.dとかで保存したのであれば,以下のような感じで実行する.
dmd -m64 -L-levent_pthreads -L-levent -L-lssl -L-lcrypto -Isrc ...(src以下のファイルを列挙) -run http_server.d
...の所は予めビルドしてlibhogeみたいなのにまとめておけば,それを指定するだけで良い.これでvibeコマンドとおさらば出来るし,普通にイベントループだけを利用できる.やったね!
Makefile
vibe.dはとてもファイルがたくさんある.構成を変更するたびにこまめにチェックしてMakefileのSRCSのような変数を修正するのは非常にばからしい.なので,今は以下のような簡単なスクリプトでリストアップしてMakefileにぶちこんでいる.
Dir['src/**/*.d'].each { |path|
puts "\t#{path} \\"
}
vibe.dがライブラリとして使えるようになっていればこんな無駄なことはしなくていいんだけど…
追記 (2014/09/08)
最近vibe.dをチェックしてみたら,vibe/appmain.d
にVibeCustomMainというversionが増えていた.これをセットしてやると,上記でいうmainが勝手に追加される問題が解決出来る.
msgpack-rpc-dではdubの設定で以下のようにしており,外部から使うときにはvibe.dの俺俺mainを呼ばないようにした.
"configurations": [
{
"name": "default",
"versions": ["VibeCustomMain"]
}
]