Perlでコマンドラインサーバを書いてCPANモジュールに同梱する
TIME rest time current/total
TopicsPlaceHolder

Perlでコマンドラインサーバを書いてCPANモジュールに同梱する

Shibuya.pm #17

Jun 2nd, 2015

Profile

songmu

Mackerel Logo

 

本題

コマンドラインサーバーが好き

僕がCPANに上げたサーバー

CPANモジュールにサーバーを同梱する方法

サーバースクリプトをどう書くか

apns-agentの場合

アプリケーション用の引数解析を行なった後に、Plack::Runnerにお任せ。

#!/usr/bin/perl
use strict;
use warnings;
use Plack::Runner;
use APNS::Agent;

# 引数解析
my ($opt, $argv) = APNS::Agent->parse_options(@ARGV);

# psgiの作成
my $psgi_app = APNS::Agent->new($opt)->to_app;

my $runner = Plack::Runner->new;
# 先頭に無理矢理defaultポートを指定
$runner->parse_options('--port=4905', @$argv);
$runner->run($psgi_app);

引数解析

@ARGVAPNS::Agent に必要な引数と残りの引数に分ける

my ($opt, $argv) = APNS::Agent->parse_options(@ARGV);

# 中身
sub parse_options {
    my ($class, @argv) = @_;
    my $p = Getopt::Long::Parser->new(
        # pass_throughが必須
        config => [qw/posix_default no_ignore_case auto_help pass_through bundling/]
    );
    $p->getoptionsfromarray(\@argv, \my %opt, qw/
        certificate=s
        private-key=s
        disconnect-interval=i
        sandbox!
        debug-port=i
    /) or Pod::Usage::pod2usage();
    Pod::Usage::pod2usage() if !$opt{certificate} || !$opt{'private-key'};

    Hash::Rename::hash_rename(\%opt, code => sub {tr/-/_/});
    (\%opt, \@argv);
}

PSGI Appを作成

# psgiの作成
my $psgi_app = APNS::Agent->new($opt)->to_app;

Plack::Runnerを利用して起動

my $runner = Plack::Runner->new;
# 先頭に無理矢理defaultポートを指定
$runner->parse_options('--port=4905', @$argv);
$runner->run($psgi_app);

DEMO

YAPC::Asiaのトーク応募中です

http://yapcasia.org/2015/talk/show/5b1cd536-07ed-11e5-9e42-79c97d574c3a

We are Hiring

hatena