LoginSignup
14
14

More than 5 years have passed since last update.

vibe.dをライブラリとして使う

Last updated at Posted at 2013-01-29

末尾に追記あり

モチベーション

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.dvibe.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.dVibeCustomMainというversionが増えていた.これをセットしてやると,上記でいうmainが勝手に追加される問題が解決出来る.

msgpack-rpc-dではdubの設定で以下のようにしており,外部から使うときにはvibe.dの俺俺mainを呼ばないようにした.

    "configurations": [
        {
            "name": "default",
            "versions": ["VibeCustomMain"]
        }
    ]
14
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
14