Skip to content

Instantly share code, notes, and snippets.

@hayajo
Last active August 29, 2015 14:11
Show Gist options
  • Save hayajo/b7f39bee3f9f9d3e1c9c to your computer and use it in GitHub Desktop.
Save hayajo/b7f39bee3f9f9d3e1c9c to your computer and use it in GitHub Desktop.
2014年度版 Perlウェブアプリケーション作成フロー

2014年度版 Perlウェブアプリケーション作成フロー

  • CPANizeできるようにscript/やshare/など、CPANパッケージレイアウトに沿って作成する
  • DockerやHeroku運用を見越しミドルウェアとの連携は環境変数で行う

雛形作成

Minillaでアプリケーションの雛形を作成

$ minil new --user $USER App::MyApp
$ cd App-MyApp

Mojoliciousインストール

cpanfileにMojoliciousの依存を追加

$ cat <<EOF >>cpanfile
requires "Mojolicious", "0";
requires "IO::Socket::SSL", "0";
EOF

cartonで依存モジュールをlocal/にインストール

$ carton install

実行スクリプト生成

mojo generateで実行スクリプトを生成

$ carton exec -- mojo generate lite_app script/myapp
$ git add .

スクリプトの動作確認

$ carton exec -- minil run perl -Ilib script/myapp get /

[SPA開発]アセットの扱い

アセットの準備

Yeoman + AngularJS環境の準備(すでに準備してある場合は不要)

$ npm install -g yeoman-doctor && npm install -g yo && npm intall -g generator-angular

AngularJSのアセットを生成

$ mkdir -p share/angularjs && cd share/angularjs
$ yo angular

Gruntのビルド先を変更してビルドを実行

$ sed -ri "s/dist: 'dist'\$/dist: '..\/public'/" Gruntfile.js
$ grunt
$ cd ../../
$ git add .

既存のリポジトリからcloneした場合

$ cd share/angularjs
$ bower install

Mojoliciousからアセットを参照する

File::Shareをインストール

$ echo 'requires "File::Share", "0";' >>cpanfile
$ carton install

script/myappを下記に変更

$ cat <<'EOF' >script/myapp
#!/usr/bin/env perl
use Mojolicious::Lite;

use App::MyApp; # for File::Share.dist_dir.
use File::Share qw/dist_dir/;

push @{ app->static->paths },
  map { File::Spec->catdir( dist_dir('App-MyApp'), $_ ) } qw|angularjs/app angularjs public|;

get '/' => sub {
    my $c = shift;
    $c->reply->static('index.html');
};

app->start;
EOF
$ git add .

MANIFEST.SKIPを作成(パッケージに含めるアセットはshare/public配下のみとする)

$ echo '^share/angularjs/' >>MANIFEST.SKIP
$ git add .

動作確認(AngularJSのminifyされたHTMLが表示されればOK)

$ carton exec -- minil run perl -Ilib script/myapp get /

パッケージング

$ carton exec -- minil dist

Dockerで動作確認

$ cat <<EOF >Dockerfile
FROM perl
COPY *.tar.gz /app/src/
WORKDIR /app/src
RUN cpanm *.tar.gz
EXPOSE ["myapp"]
EOF
$ docker build -t $USER/myapp .
$ docker run --rm $USER/myapp get /
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment