Proclet::Declare について考えた
foreman で Procfile でがんばろうとおもったのだけど、なんか妙に終了がおそいのが気にくわないのと、なんか外部 DSL 疲れ的な心境にいたり、最近 Proclet に foreman 的なことができる機能がはいったということもあって、Proclet で DSL でやっつけることにした。
以下のようなコードをかいて
package Proclet::Declare; use strict; use warnings; use Proclet; use parent qw/Exporter/; our @EXPORT = qw/env service run/; our %REGISTRY; sub _proclet() { return $REGISTRY{caller(1)} ||= Proclet->new(color => 1); } sub env { my %env = @_; while (my ($k, $v) = each %env) { $ENV{$k} = $v; } } sub service { my ($tag, $code) = @_; _proclet->service( code => ref($code) eq 'CODE' ? $code : sub { exec($code); die $! }, tag => $tag, ); } sub run() { _proclet->run; } 1;
以下のようなブートストラップコードをかく。
use strict; use warnings; use Proclet::Declare; env( SLEDGE_CONFIG_NAME => 'development', LM_COLOR => 1, ); service('web', 'plackup -p 5963 app.psgi'); service('memcached', '/usr/local/bin/memcached -p 11211'); run;
と、いいかんじにうごくという寸法。
Proclet さんまじ便利やー。kazeburo++