erl-shib

ここ最近は、Erlangの習作としてshibのクローンを作ってました。erl-shibと言います。HQLを実行して結果を取得するところまでは何とか動くようになりました。

そうこうしているうちにHiveまわりの開発環境を移行する必要が出てきてしまったので、そのついでに開発環境そのものを見直すことに。

まずはとにかく作って動かすことを優先してきたので、コードがヒドく、リファクタリングしようにもテストコードをあまり書いておらず、テストコード自体もメンテをしてきませんでした。

そこで今回は、Erlangのコードをリファクタリングできる状態にする為、以下のページを参考にしながら開発環境を再構築しました。

Makefile

ErlangのコードのビルドにはMakefileを使用しています。基本的にはrebarでコンパイルや依存モジュールの取得、テスト、リファレンスの生成など何でもできるのですが、タスク間の依存関係やリリースを考えるとMakefileの方が管理しやすい、ということなのでしょうか。以下のページのMakefileを使わせてもらってます。

Watchdog

Erlangはコンパイル言語(でも型の解決は動的)なので、コードを変更したらコンパイルが必要になります。IDEによっては変更を検知して自動的にビルドしてくれる機能がありますが、私はEmacsを使っていてそこまでの機能は準備していませんでした。

そこで、前記ページにあるようにWatchdogを使ってみることに。ただ、どうも環境が悪いのか、そのままだとpipでwatchdogのモジュールが見つからなかったので、pip.confにmirrorの設定してインストールしました。

Emacsの場合、バッファに変更が入った時点で.#ファイルができてしまい、それがwatchmedoに拾われてしまうので、.#ファイルはignoreするようにしました。

1$ watchmedo shell-command --patterns="*.erl;*.hrl" --ignore-pattns="*.#*.erl;*.#*.hrl" --recursive --wait --command="make test" include src test

これでErlangのコードに変更が入ったらEUnitが動くようになり、リファクタリングする環境は整いました。

EUnit

EUnitの使い方は以下のページを参考にしました。

xUnitのコードを書いたことがあれば特に難しくありません。ただ、ちょっと面倒なのはsetup/cleanupの指定の仕方。テストジェネレータを使って都度指定するのがちょっと億劫です。このあたりはもうちょっと何か探してみます。

Conclusion

これでようやくリファクタリングできる状態になりました。コードを直していきながら、Erlangを理解していきたいと思います。