packagist に net-empty_port というモジュールを公開した話

packagist: https://packagist.org/packages/dooaki/net-empty_port
github: https://github.com/do-aki/Net-EmptyPort

net-empty_port とは

実行したマシンの空いてるポートを探し出してくれるモジュール。
https://metacpan.org/module/Net::EmptyPort にインスパイアされて作りました。というか、ロジックまんまです。

テスト用サーバの立ち上げなんかに、特定のポートをハードコーディングしちゃうと環境によって動かなくなっちゃうので、そう言うときに便利だよねってもの。

サンプルのつもりでエコーサーバ書いてみたけど、 socket 系の関数を生で使うのメンドイから、ラップしたいね。

<?php
use dooaki\Net\EmptyPort;

require __DIR__ . '/vendor/autoload.php';

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$port = EmptyPort::find();
echo "port: {$port}\n";

socket_set_option($sock, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sock, '127.0.0.1', $port);
socket_listen($sock);
while ($client = @socket_accept($sock)) {
  while($buf = socket_read($client, 256, PHP_NORMAL_READ)) {
    socket_write($client, $buf);
  }
}

packagist に登録したこと

ほとんど全て http://blog.monochromegane.com/blog/2013/06/02/development-php-composer-library-at-packagist-2/ に書かれてるので、これを参考にしてさくっと。


ベンダー名は dooaki にした。
最初は do_aki あるいは do-aki にしようと思ったのだけど、do-aki だと namespace として使えないし、do_akl だと タイプするのが面倒なので dooaki を採用。
読み的にもこれなら揺れないし


composer による構成管理はとても便利ではあるのだけど、packagist に公開するまでにやらなきゃならない定型部分が多いので、その辺を支援するコマンドがあるとよさそう。
とはいえ、一度設定しちゃえばあとは push するだけなのでそこまで必要でもないか。

coverall とか

モジュール書いたなら継続的なテストは必須ですよねーって事で、Travis CI つかってるんだけど、
最近 Coverallsカバレッジ表示 (計測そのものはユニットテスト実行時に行っている) できることを知ったので導入。

Coveralls のドキュメント( https://coveralls.io/docs/php )によれば、PHP から利用するには php-coveralls か atoum を使えば簡単にできるらしい。
ただ、ユニットテストphpunit で書いているので前者を選択。

以下のように、 phpunit で clover.xml を出力したあとに、 coveralls コマンドを呼び出すだけでOK でした。

script: 
  - php vendor/bin/phpunit --bootstrap tests/bootstrap.php --coverage-clover build/logs/clover.xml tests && php vendor/bin/coveralls -v