Starting an Erlang Project
-
Upload
guest2056d -
Category
Technology
-
view
155 -
download
0
Transcript of Starting an Erlang Project
ビルドツール世の中には、ビルドツールが沢山ある
GNU make, OMake, ant, MakeMaker, Rake, SCons, etc...
何を使うかは好み!
有名な Erlang Project でも様々
Erlang 標準の Emake は、多分、不人気
3
ディレクトリ構成
名前 用途ebin *.beam、*.appinclude *.hrlpriv その他のファイルsrc *.erl、など
Erlang のマニュアルに記載されているディレクトリhttp://erlang.org/doc/design_principles/applications.html#app_dir
4
ディレクトリ構成
名前 用途
doc EDoc で生成したドキュメント
log SASL error_logger で出力されたログ
test Common Test 関連のファイル
公式ではないが、一般的なディレクトリ
5
ディレクトリ構成
名前 用途
contrib 便利なツールなど(Kai)
deps 依存モジュール(Mochiweb)
examples サンプルコード
scripts スクリプトファイル
既存プロジェクトで採用されているディレクトリ
6
起動と停止Erlang は VM 上で動作する
erl コマンドで VM を起動する必要がある
独自のコンソールを持つ
シェルと相性が悪い
escript は main/1 の終了 = VM の終了
常駐する処理に不向き
7
起動と停止Erlang は VM 上で動作する
常駐する処理に向く
コンソールはデタッチ&アタッチできる
escript は main/1 の終了 = VM の終了
シェルと相性が良い
使い捨て処理に向く
8
起動と停止起動はシェルで行う
#!/bin/sh
ROOT='/path/to'ERL='/usr/bin/env erl'
${ERL} -sname ${1} \ -pa ${ROOT}/ebin \ -eval 'application:start(foo).' \ -detached
※${ROOT} は、Makefile 内で sed で書き換える
9
起動と停止停止は escript で行う
#!/usr/bin/env escript%%! -sname foo_stopermain([Sname]) -> rpc:call(sname_to_node(Sname), init, stop, []);main(_) -> usage().
sname_to_node(Sname) -> Node = atom_to_list(node()), list_to_atom(Sname ++ string:substr(Node, string:cspan(Node, "@") + 1)). usage() -> io:format("usage: stop.erl [target sname]~n"), halt(1).
10
ログ管理詳しくは、Programming Erlang を参照の事
こちらもどうぞhttp://d.hatena.ne.jp/cooldaemon/20070918/1190085199
12
テストCommon Test (R12B から標準)
テスト対象とテストコードを分離
高機能
EUnit (R13B から標準)
テスト対象にテストコードを記述
Assert マクロあり
モジュールごとに test/0 を用意 (Mochiweb など)13
テストCommon Testhttp://erlang.org/doc/apps/common_test/index.html
http://d.hatena.ne.jp/cooldaemon/20080118/1200635774
EUnithttp://erlang.org/doc/apps/eunit/index.html
http://d.hatena.ne.jp/cooldaemon/20070913/1189693590
14
テストCommon Test を推奨
コードカバレッジが最高に魅力的
けれど・・・
メタ操作するとカバレッジは初期化される(メタ操作は、モックを差し替えできて便利)
別ノードのカバレッジ情報を取得できない(分散ノードを利用したプロジェクトで不便)
15
モジュールの宣伝モジュール名 用途
mochiweb 組み込み用 Web Server
smerl Meta Programming 機能の提供
erljob Job Scheduler
udp_server UDP パケットの送受信 Server
list_utils List 操作機能の提供
※全て Ermlia で使用しているhttp://github.com/cooldaemon/ermlia/tree/master
16
mochiwebErmlia の場合、リポジトリに直接配置
気が向いたら更新
make 時に余計な事をさせない(doc の生成とか)
ermlia_web で mochiweb_http を start
Req:recv_body で Content を受信http://code.google.com/p/mochiweb/
17
smerlMeta 操作機能の提供
Erlyweb の Model 生成などに利用
Ermlia ではテスト時にプロセスをモックに置換する用途で利用
カバレッジ情報が消えるので、個人的には非推奨http://yarivsblog.com/articles/2006/08/14/smerl-simple-metaprogramming-for-erlang/
http://d.hatena.ne.jp/cooldaemon/20080629/1214746935
18
erljobgen_fsm ベースに切り替え予定http://github.com/cooldaemon/erljob/tree/master
20
udp_server“kai で言うところの tcp_server” の UDP 版
Supervisor の監視下
一つのソケットを使い回す
active モードにも対応http://d.hatena.ne.jp/cooldaemon/20080715
21
list_utilslists モジュールの物足りない部分を補完
シングルノードで動作する pmap
例外を投げない split
split_map、split_foldl、etc...http://gist.github.com/7239
22