順番
- 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