順番
- gitインストール
- plenvインストール
- cpanmインストール(plenv経由)
- Cartonインストール
- Mojoliciousインストール
- Cinnamonインストール
plenv
# plenvのバージョン plenv --version # インストール可能なPerl $ plenv install --list # バイナリインストール $ plenv install 5.16.2 -Dusethreads # change global default perl to 5.16.2 $ plenv global 5.16.2 # change local perl to 5.14.0 $ plenv local 5.14.0 # run this command after install cpan module, contains executable script. $ plenv rehash # アップグレード $ cd ~/.plenv $ git pull # インストール済みリスト $ plenv versions # 現在のPerl $ plenv version # install cpanm to current perl $ plenv install-cpanm
cpanm
# 現在のPerlバージョンを確認して、plenv経由でインストール $ plenv install-cpanm # cpanmバージョン確認 $ cpanm -V # 自身のアップデート $ plenv exec cpanm --self-upgrade # モジュールのインストール $ plenv exec cpanm Plack $ plenv exec cpanm Plack/Request.pm $ plenv exec cpanm MIYAGAWA/Plack-1.0000.tar.gz $ plenv exec cpanm /path/to/Plack-1.0000.tar.gz $ plenv exec cpanm http://cpan.metacpan.org/authors/id/M/MI/MIYAGAWA/Plack-0.9990.tar.gz $ plenv exec cpanm git://github.com/plack/Plack.git # 1.0000 以降 $ plenv exec cpanm Plack~1.0000 # 最新の 1.xxxx $ plenv exec cpanm Plack~">= 1.0000, < 2.0000" # 特定のバージョン。 Plack~"== 0.9990"と同じ $ plenv exec cpanm Plack@0.9990
モジュールの確認
# CGI.pmの場所 $ perldoc -l CGI /Users/yugo/.plenv/versions/5.18.1/lib/perl5/5.18.1/CGI.pm
Carton
「アプリケーションにおけるPerlモジュールの依存関係を管理するコマンドラインツール」
# インストール $ plenv exec cpanm Carton # 確認 $ plenv exec carton -v # カレントディレクトリのcpanfileファイルを参照して # カレントディレクトリ直下のlocalディレクトリにモジュールをインストール # ※cpanfile.snapshotに記録される $ plenv exec carton install # cpanfileを元に… $ plenv exec carton install # cpanfile.snapshotを元に… $ plenv exec carton install --deployment
cpanfile
# 0.03 またはそれ以上 requires 'Yugo', '0.03'; # 0.03 requires 'Yugo', '== 0.03'; # 以上とか以下とか requires 'Yugo', '<= 0.03'; requires 'Yugo', '< 0.03'; requires 'Yugo', '> 0.03'; requires 'Yugo', '>= 0.03'; # Perlの指定も可(cartonとcpanmが反応) requires 'perl', '5.16.3';
Mojolicious
- Mojolicious · yuki-kimoto/mojolicious-guides-japanese Wiki · GitHub(日本語ガイド)
- Mojoliciousでつくる! Webアプリ入門(Slideshare)
$ mkdir bloc
$ cd bloc
$ nano cpanfile
requires 'perl', '5.16.3';
requires 'Mojolicious', '== 4.65';
requires 'Plack', '== 1.0030';
$ plenv exec carton install
# "carton exec"の後ろに" -- "でつないでコマンド
$ plenv exec carton exec -- mojo generate app Bloc::Web
$ mkdir psgi
$ cd psgi
$ nano bloc.psgi
use strict;
use warnings;
use Mojo::Server::PSGI;
use Plack::Builder;
use lib './lib';
use Bloc::Web;
my $psgi = Mojo::Server::PSGI->new( app => Bloc::Web->new );
my $app = $psgi->to_psgi_app;
builder {
$app;
};
$ cd ..
$ plenv exec carton exec -- plackup -p 5000./psgi/bloc.psgi
Cinnamon
いろんな変数を設定しつつ、リモートで動かすコマンドをあれこれ記述。
コピーしたり、起動したり、読み込んだり、再起動したり。
Roleというのが「production」とか「develop」とかっていう環境セットとかで、、「update」とか「restart」とかっていうあれこれの動きはTask。
実際のコマンドは例えば「cinnamon production update」とか。
# インストール $ plenv exec cpanm Cinnamon # → cinnamon コマンドが入る # cinnamon コマンドは config/deploy.pl を自動的に見に行く。 # …ので、アプリケーションのルートから見てconfig/deploy.plに記述するとよい。 # !ここでいったん中断→gitが分かってないとCinnamonの理解はビミョウ。
- 記述されたコマンドは、そのコマンドごとにログイン/ログアウトするので、cdしてからのコマンドは「&&」でつないで。
- 複雑になるようなら、シェルスクリプトにまとめて。
サンプル
use strict; use warnings; use Cinnamon::DSL; my $application = 'My::App'; # リモートホストに接続するならログインユーザ名が必要 set user => 'johndoe';
DSL
# role
role production => 'production.example.com';
role production => [ qw(production1.example.com production2.exampl.ecom) ];
role production => sub {
my $res = LWP::UserAgent->get('http://servers.example.com/api/hosts');
my $hosts = decode_json $res->content;
$hosts;
};
role production => 'production.example.com', {
hoge => 'fuga',
};
# task
task update => sub {
my ($host) = @_;
my $hoge = get 'hoge'; # parameter set in global or role parameter
# ...
};
task server => {
start => sub {
my ($host) = @_;
# ...
},
stop => sub {
my ($host) = @_;
# ...
},
};
# set
set key => 'value';
set key => sub {
# values to be lazily evaluated
};
set key => sub {
my (@args) = @_;
# value to be lazily evaluated with @args
};
# get
my $value = get 'key';
my $value = get key => qw(foo bar baz);
# run
my ($stdout, $stderr) = run 'git', 'pull';
# sudo
my ($stdout, $stderr) = sudo '/path/to/httpd', 'restart';
# remote
my ($stdout, $stderr) = remote {
run 'git', 'pull';
sudo '/path/to/httpd', 'restart';
} $host;
# call
task deploy => sub {
my ($host) = @_;
call "update", $host;
call "web:restart", $host;
};
Git
- コミットメッセージでは、1行目が変更内容の要約、1行あけて、3行目に変更した理由、が標準的?
- 実際に作業しているディレクトリを「ワークツリー」。
- ワークツリーとリポジトリの間に「インデックス」(準備場所)が用意される。
- ディレクトリに新規ファイルを作る。
- INDEXにステージする。
- コミットメッセージを入力して、コミットする。
- リモートリポジトリにはoriginという名前を付けるのが一般的。
# INDEXへ追加 $ git add sample.txt # push # clone # pull