tokuhirom's Blog

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++