質問: OCamlでコードを書くさいに、ユニットテストを書きたいため、OUnitを利用しています。 そのとき、`foobar.ml`と`foobar_test.ml`といったように、ファイルを分けているのですが、ドキュメントを見る限りですとユニットテストを実行する方法として: ``` ocamlfind ocamlc -o test -package oUnit -linkpkg -g foobar.ml foobar_test.ml ``` というのが紹介されているのですが、毎回これを実行するのは、コマンドとして長い印象があります。仕方無いので、`make.sh`みたいな、シェルスクリプトとして、上記のラインを書いて、そこから実行しています。ですが、これはバッドノウハウのように思えて、あまりすっきりとしません。 OCamlを書くさいに、OUnitを実行するときの、良い方法があれば、教えていただけないでしょうか。
回答: ocamlbuildを使う ============= この場合であれば、ワーキングディレクトリにて、`_tags`を作成して以下のように書き込みます。 ``` true: debug, linkpkg, thread true: package(oUnit) ``` そして以下のコマンドでビルドできます。 ``` ocamlbuild -use-ocamlfind "foobar.native" "foobar_test.native" ``` `.native`でocamloptによるバイナリへのビルド、 `.byte`でocamlcによるバイトコードへのビルドになります。 `_tags`について簡単に触れておくと、カンマ区切りの左側が「後続のオプションを付ける条件」の記述で、常に適用したいオプションを`true`にします。ファイル名やディレクトリに応じたオプションの指定はここに記述します。右側にはオプションを設定します。両者の一覧は後述のマニュアルを参照して下さい。 ocamlbuildの詳細なマニュアルはこちらになります。_tagsでppxやsyntax extension、果ては最新のocamlで追加されたflambdaによる最適化も行う説明も載っています。 正直これでも冗長だと思っていますが、公式に取り込まれたドキュメント(先程のマニュアル)によれば将来-use-ocamlfindはデフォルトになるかもしれないものの、シェルのエイリアス等で対処しておくことをおすすめしているようです。 ここからは余談 ======= ### mliの自動生成 上記の設定でpackageを配置した上で、 ``` ocamlbuild -use-ocamlfind "foobar.inferred.mli" ``` とすると`foobar.ml`のシグネチャを推論したmliが自動生成されます。勿論人間の手直しも必要ですが、mliを良いドキュメントとする土台として非常に便利なので憶えておいて損は無いと思われます。 ### プロジェクトの管理 また、ocamlbuildは簡単な設定ならば便利なのですが、これだけでプロジェクトを管理するのは大変です。ocamlbuildを細かく操作できるらしい`myocamlbuild.ml`は私も手書きしてません... もし今まとまった物を作っていらっしゃるのであれば、OASISをおすすめしておきます。 (ユニットテストという単語からそんな雰囲気がしたので) Lwtを始めとした多くのプロジェクトで実用されており、見覚えのある感じの管理ができます。 使い方はこちらです。