- CPANizeできるようにscript/やshare/など、CPANパッケージレイアウトに沿って作成する
- DockerやHeroku運用を見越しミドルウェアとの連携は環境変数で行う
Minillaでアプリケーションの雛形を作成
$ minil new --user $USER App::MyApp
$ cd App-MyApp
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 /
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 .
$ cd share/angularjs
$ bower install
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
$ 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 /