https://github.com/bingos/devel-patchperl/issues/12 bingos 氏に、perl distribution の tar ball を展開したディレクトリからバージョン情報をえる API を public API にしてもらった。
Harriet ー テストのときつかうにデーモンの取扱を簡単にするためのフレームワーク
- https://github.com/tokuhirom/Harriet/
- https://metacpan.org/module/TOKUHIROM/Harriet-0.01/lib/Harriet.pm
テストのときにつかう mysqld, memcached, stf, groonga あたりのデーモンを、.t 単位で起動していては遅くてかなわない。かといって、あらかじめ起動させておくというのも。。 というわけで prove のプラグインとしてよしなにする、みたいなのをがんばってかく、というような試みがおこなわれてきたわけですが、どうもめんどくさい。 なんか適当にやったらうまくうごく、っていうかんじのカジュアルなツールがほしいな、なんておもったりするわけですよ
そこで、Harriet ってのをつくってみました。
なんかこう、t/harriet/mysqld.pl っていうファイル名でこんなファイルをおきましょう、と。
$ENV{TEST_MYSQL} ||= do {
require Test::mysqld;
my $mysqld = Test::mysqld->new(
my_cnf => {
'skip-networking' => '', # no TCP socket
}
) or die $Test::mysqld::errstr;
$HARRIET_GUARDS::MYSQLD = $mysqld;
$mysqld->dsn;
};
で、t/harriet/memcached.pl っていうファイルもおきます、と。
$ENV{TEST_MEMCACHED} ||= do {
require Test::TCP;
my $server = Test::TCP->new(
code => sub {
my $port = shift;
exec '/usr/bin/memcached', '-p', $port;
die $!;
}
);
$HARRIET_GUARDS::MEMCACHED = $server;
'127.0.0.1:' . $server->port;
};
環境変数に、デーモンの情報をつめこみますよ、と。環境変数がすでにあったらなにもしませんよ、と。そういうことです。
この .pl ファイル自体は、ほんとうにたんなる .pl ファイルです。簡単ですね。
で、テストスクリプトの中では以下のようにやれば、スクリプトが自動的に実行され、デーモンがあれば、そのままだし、なければよしなに起動してくれ、おわったら自動的にデーモンは死亡します。
use Harriet;
Harriet->new('t/harriet')->load_all();
さて、このままだととくにどうということもないのですが、ここにさらに App::Prove::Plugin::Harriet がからんできます。.proverc に -PHarriet=t/harriet/ とかいておくと、自動的に prove がテストを実行する前に t/harriet/ においてあるスクリプトをよみこんでくれます。テストスイート全体を実行する前に一回うごかしてくれるんで、らくちんであるといえましょう。
さらに、harriet コマンドというものも付属していて、マジでハードにテストしてるときは、このコマンドをつかうと、デーモンを子プロセスとして起動した上で、必要な環境変数を表示し、sleep してくれます。
% harriet t/harriet HTTP::Server::PSGI: Accepting connections at http://0:50921/ export TEST_MEMCACHED=127.0.0.1:50797 export TEST_MYSQL=DBI:mysql:dbname=test;mysql_socket=/tmp/TC_XzkXwke/tmp/mysql.sock;user=root export TEST_STF=http://127.0.0.1:50921
あとは、test を実行する terminal にコピペしておけば、なんとなくいいかんじになります。
というわけで、そんなにコード量はおおくないのですが、フレームワークとして定義することにより、お気楽にかけるようになってる雰囲気になっているので、おためしください。
なお、Harriet という名前は、プロセスを長生きをさせるという意味で、長生きした亀から名前をとっています。
Minilla を用いた Perl モジュールの作り方
http://shanon-tech.blogspot.jp/2013/05/perl.html
Perl モジュールの作り方、2013年においては Authoring tool をつかって作るのがよいです。具体的には Minilla でつくるのがオススメであります。
perlbrew なり plenv なりで perl をいれたあとは、
% cpanm Minilla
として Minilla をインストールします。
% minil new Foo
とすると、Foo.pm のスケルトンができあがります。作者の名前などは ~/.gitconfig などから自動的にさがしてきますので、設定不要です。
できあがったディレクトリは以下のような形になっています。
Foo
├── Build.PL
├── Changes
├── cpanfile
├── lib
│ └── Foo.pm
├── LICENSE
├── META.json
├── README.md
└── t
└── 00_compile.t
2 directories, 8 files
Build.PL は、Minilla が自動生成したファイルです。Rakefile とか Makefile とか、setup.py とか、Makefile.PL とか、そういったものに相当するファイルですね。直接編集することはありません。
META.json は、モジュールのメタデータがはいっているファイルです。cpanfile, lib/Foo.pm からモジュールの情報をかきあつめて、Machine readable なフォーマットとして出力したものです。自動生成可能なのですが、リポジトリにふくめておくと、cpanm でリポジトリから直接インストールできて便利です。基本的にはリポジトリにいれるようにしてください。
RAEDME.md は、lib/Foo.pm から自動生成されます。これは github での見栄えをよくする効果があります。github のためだけに存在するファイルであるといってもさしつかえありません。。
t/ ディレクトリはテストスクリプトを配置するディレクトリです。どんどん配置していってください。
LICENSE ファイルは、ライセンス情報がはいっているファイルです。minil new はデフォルトで Perl5 とおなじ Artistic License で LICENSE ファイルをつくります。
Changes ファイルは、モジュールの変更履歴を記述するファイルです。「リリースされる tar ball には s/{{$NEXT}}/$version $date/ したものがはいって元の changes には s/{{$NEXT}}/ {{$NEXT}}\n\n$version $date/ したものがはいる」という挙動をするのがちょっとわかりづらいところではありあます。。
テストをうごかす
% minil test とすると、テストスイートがうごきます。
% prove -rl t/ などとしても、シンプルな pure perl のモジュールの場合には問題ありません。
インストールする
% cpanm . でインストールできます。
tar ball をつくる
% minil dist で、カレントディレクトリに tar ball ができます。
リリースする
CPAN にあげたい場合には、minil release とうてば OK です。いろいろメッセージがでてきますので、その通りにやればいいです。
Perl 5.18.0-RC2 がきている
http://www.nntp.perl.org/group/perl.perl5.porters/2013/05/msg201723.html きている。
ぼちぼち、Perl 5.18.0 がでるでしょう。
ちなみに僕の感触では、5.18.0 では、スゴい新機能とかはとくになく、むしろ失敗だった機能の縮小と、ハッシュまわりのオーバーホールがメインになった、という印象です。
Spellunker のステータスについて
通常ケースでの使用には問題がなく、ほぼ完成です。
Module::Metadata 1.000012 がでていた
Module::Metadata 1.000012 が ETHER 氏によってリリースされていた。 私が先日ブログにておしらせした致命的なバグ2点にたいするパッチもとりこまれており、やっとまともにつかえそうか、といったところである。
el-get に pull-req したらとりこまれてた
https://github.com/dimitri/el-get/pull/1204 howm のバージョンふるくて Emacs 24 でつかえないので、最新版がはいるようにして p-r しておいたところ、とりこまれていた。
homebrew とちがって、複数人で一斉にみてるとかじゃないのでマージ速度がおそいのかな、とおもった。