第2章 開発環境を構築

2.1 開発環境のイメージをつかむ

前回はざっくりと開発内容について考えてみました今回は具体的な環境構築の手順をみていきます。

アプリ開発の経験の浅い人にとってはどのような開発環境を用意すれば良いのかの判断は大変難しいと思います。

アプリ開発の途中で作ろうとしているものの仕様が変更になったり、技術的に現在の環境では困難になったり、何が起こるかはわかりませんから、こればかりは場数を多くふんでゆくしかないのかもしれません。

間違いなく言えることがあるとすれば再現がしやすい開発環境を構築するのが良いとお思います。今回は docker の仕組みは拝借することにしました。

下記が開発システム全体のイメージです。

        +----------------------------------------+
        | bulletin (application) <-- Make here!! |
      +--------------------------------------------+
      |          Mojo (Web Framework)              |
    +-----------------------------------------------+
    |          Perl (Programming language)          |
  +---------------------------------------------------+
  |              docker (Virtual space)               |
+-------------------------------------------------------+
|                  OS (MacOS or Linux)                  |
+-------------------------------------------------------+

2.2 開発環境ついて参考になる資料

ネットを検索するとさまざまな資料ができてきますが、一番確実性が高いのは公式ページのドキュメントになるので公式ページは押さえておきましょう。

2.3 構築手順を残しておく

今回は docker-compose up コマンド一発で全てが立ち上がってアプリケーションサーバーが起動するような形にしたいとおもいます。docker についてはこの Becomブログでも過去に取り上げていますので解説はそちらを参考ください。

環境構築というのはたまにしか行わないのでどうしても手順を忘れがちになる上に、どうして今回このような手順を組み上げたのかということを環境構築の経験が浅い人に理解できるように説明することはとても難しいです。

ここでは具体的なコマンドや設定ファイルについては github の方にサンプルコードをのこしていますので詳細はそちらを参考ください。

手順が短い場合は README.md ファイルにのこしておき、構築環境がローカルだけでなく公開サーバーやまた複数の公開サーバーに渡る場合は docs/... というディレクトリをつくりその中に手順を書いたファイルを残しておくのもいいかもしれません。

2.4 手順を整理しておく

2.4.1 ソースコードの展開場所を決めておく

今回は docker 環境中で全てを構築する予定ですので必要な手順は docker 関連のファイルに記述することになりますが手元のPCのどこのディレクトリを作業場所にするのかは決めておいたほうがいいです。基本的には任意のディレクトリでよいですが、自分なりにアプリ開発するときはここにするとあらかじめ決めておくとよいです。

ちなみに私の場合は
  • github で管理してる内容 -> ~/github/ ディレクトリ内に展開
  • とりあえず試しに作る場合 -> ~/tmp/ ディレクトリに展開
  • 実行コマンドスクリプトをおく場所 -> ~/bin/ ディレクトリに配置(実行権限とパスを通しておく)

2.4.2 ミドルウェアアプリのインストール手順をイメージしておく

アプリ開発をする時に必要なアプリのことをミドルウェアアプリという言い方をすることがあります。ミドルウェアアプリにはインストールの手順、それはこういうコマンドを入力してインストールするという意味とこういう順番にインストールしないといけないという二通りがあります、例えば Perl の拡張モジュールをインストールするまえに Perl 自体をインストールしないといけないという意味です。

順番があるのは当たり前の話かもしれませんが、意外に環境構築でつまづいてしまう原因は順番通りにインストールできていなからということもあったりします。

今回は下記のような順になります

  • docker 自体のインストール
  • docker の中で
    • Perl 5.32.1 -> 公式イメージ
    • Carton -> Perl モジュール
    • 仮想空間の /usr/src/app をソースコード展開場所に指定
    • sqlite3 -> 簡易的なデータベースアプリ
    • Mojolicious -> Perl モジュール、web フレームワーク
    • bulletin.pl -> 今回のアプリのソースコードファイル
    • bulletin.db -> sqlite3用のデータベースファイル
    • morbo 実行 -> Mojo の開発用アプリケーションサーバー

2.5 具体的な手順

docker 自体は事前にインストールを済ませておいてください。今回は手元のPCの ~/tmp/ 配下にソースコードを展開することにします。

(任意のディレクリを作成、今回は ~/tmp/bulletin/)
% mkdir -p ~/tmp/bulletin/ && cd ~/tmp/bulletin/
(ファイルの中身は下記の記事参考)
% touch Dockerfile docker-compose.yml compose-cmd.bash && \
chmod +x compose-cmd.bash && \
echo "requires 'Mojolicious', '== 9.01';" > cpanfile && \
echo "local/\n.DS_Store\ndb/*.db" > .gitignore
(データベースのファイルを作っておく、内容は下記の DB のスキーマ)
mkdir db && touch ./db/bulletin.sql
(最初はイメージがないので build オプションで実行)
% docker-compose up --build
(ビルドがすべておわったら web ブラウザで localhost:3000 で確認)
(2回目からはこちらで実行)
% docker-compose up

Dockerfile

FROM perl:5.32.1
RUN cpanm Carton && mkdir -p /usr/src/app && \
apt-get update && \
apt-get install -y sqlite3
WORKDIR /usr/src/app

docker-compose.yml

version: '3.8'
services:
  web:
    container_name: ctr-beginning-mojo
    build:
      context: .
    image: img-beginning-mojo
    volumes:
      - .:/usr/src/app
    ports:
      - '3000:3000'
    command: './compose-cmd.bash'

compose-cmd.bash

#!/usr/bin/env bash
carton install && \
carton exec -- mojo generate lite-app bulletin.pl
if [ -f ./db/bulletin.sql ] && [ -f ./db/bulletin.db ]; then
    carton exec -- morbo bulletin.pl
elif [ -s ./db/bulletin.sql ]; then
    sqlite3 ./db/bulletin.db < ./db/bulletin.sql
    carton exec -- morbo bulletin.pl
else
    echo "not exist bulletin.sql !!"
fi

bulletin.sql

DROP TABLE IF EXISTS bulletin;
CREATE TABLE bulletin (                                 -- 掲示板
    id              INTEGER PRIMARY KEY AUTOINCREMENT,  -- ID (例: 5)
    comment         TEXT,                               -- コメント (例: '明日は晴れそう')
    deleted         INTEGER,                            -- 削除フラグ (例: 0: 削除していない, 1: 削除済み)
    created_ts      TEXT,                               -- 登録日時 (例: '2021-02-26 17:01:29')
    modified_ts     TEXT                                -- 修正日時 (例: '2021-02-26 17:01:29')
);

2.6 まとめ

2.7 次回

最近ではdockerを活用して開発環境を構築することが増えてきました。最初のdockerファイルの作成さえしてしまえば、他の人の環境で再現するときはコマンド一発で再現できるのでとても便利です。

次回からはアプリの具体的な実装方法についてすすめてゆきます。