読者です 読者をやめる 読者になる 読者になる

はむはむエンジニアぶろぐ

このブログのコンセプトは"ハッキングの為なら愛する家族を傷つけることをいとわない" 自分にとってエンジニアリングは "手段ではなく生きる目的" である

Makefileとシェルスクリプトを使ってテンプレートからファイルを作成する

f:id:secret_hamuhamu:20150423012732j:plain
例えば、PHPクラスを作成しようとした時に、PHPクラスを cp して、ファイル名変更。
コピーした新しいクラスをエディッタで開き、クラス名を変更。
コピーミスでトラブったりクラス名変更し忘れてテスト通らないとかあるあるだと思います。
Makefileシェルスクリプトを使って、テンプレートをもとに自動でファイル作成をしてみようと思います。

やりたいこと

以下のコマンドを実行すると、テンプレートからファイルを作ってくれる。
ターミナルに以下のコマンドを渡してあげる。なお gmakeエイリアスである。

$ gmake php-class NAME=Hoge

コマンドを実行した、ディレクトリでHoge.phpが作成される。

<?php

class Hoge
{

    public function __construct()
    {
    }

    /**
     * IDを返す
     * @param int $id ID
     *
     * @return $id
     */
    public function get($id)
    {
        return $id;
    }
}

次の項から、これを実施するために必要なスクリプトを作成していく。

テンプレートの準備

以下のファイルを作成。
mkdirしてディレクトリも作る。

~/gmake/template/PHP/class.php

<?php

class NAME
{

    public function __construct()
    {
    }

    /**
     * IDを返す
     * @param int $id ID
     *
     * @return $id
     */
    public function get($id)
    {
        return $id;
    }
}

NAME というところを置き換えの対象とします。

シェルスクリプトの準備

以下のファイルを作成。
mkdirしてディレクトリも作る。

~/gmake/bin/make_from_template.sh

Makefileにやらせるには複雑な処理は、シェルスクリプトでやります。

#!/bin/sh

# 変数宣言時は=の前後にスペースを入れることは出来ない
TEMPLATE_FILE_PATH=$1   # テンプレートのファイルパス
MAKING_DIR=$2           # テンプレートから作られるファイルの作成先ディレクトリ
NAME=$3                 # 拡張子を除くファイル名
EXTENSION=$4            # 拡張子

CREATE_FILE_PATH="$MAKING_DIR"/"$NAME"."$EXTENSION"

# 渡された引数が4つでなければ、exit
if [ $# -ne 4 ]
then
    echo not arg NAME. NAME=arg.;
    exit 1;
fi

# -i 上書き確認
cp -i $TEMPLATE_FILE_PATH $CREATE_FILE_PATH

# ファイル名を置換
perl -pi -e s/NAME/"$NAME"/ $CREATE_FILE_PATH

echo 'compleate !';

Makefileの準備

Makefileは、Makefileがあるディレクトリでmakeするか、ファイル名を指定してmakeしなければなりません。
テンプレートからファイルを作りたいディレクトリには、もちろんMakefileはないし、わざわざMakefileのパスを覚えてmakeするのは辛いです。
ちょっと環境依存になりますが、グローバル(global)にmake出来るようにします。

.zprofile or .zshrc に以下の設定を追加。

Makefileは、ユーザからのターゲットと引数を受け取りこのシェルスクリプトを実行するインターフェースという使い方です。
ちなみにGNU makeでは1行毎に1つのシェルで実行されため、Makefileのターゲットの中で変数宣言を行う事はできない。

alias gmake='make -f ~/gmake/Makefile'

これで、 gmake とするとどこでも、make出来るようになります。

~/gmake/Makefile

BIN_DIR  = ~/gmake/bin
MAKING_DIR = $(PWD)
# Usqge
#    $1 テンプレート
#    $2 ファイル作成先
#    $3 拡張子を除いたファイル名
#    $4 拡張子
  MAKE_FROM_TEMPLATE = $(BIN_DIR)/make_from_template.sh

  php-class:
      @$(MAKE_FROM_TEMPLATE) ~/gmake/template/PHP/class.php $(MAKING_DIR) $(NAME) php

実行確認

引数NAMEを忘れていた場合は、exitされる。

$ gmake php-class                                                                                                                                                                           +[master]

not arg NAME. NAME=arg.
make: *** [php-class] Error 1


引数NAMEをつけて実行。

$ make php-class NAME=Fuga                                                                                                                                                                 +[master]

compleate !

無事、Fuga.phpが作成される。

まとめ

まだまだ、リファクタリング出来る所あるし、もっとテンプレートを作って汎用的にしていきたい。
Githubに公開してるので、気になる所あればpull requestお願い致します。

https://github.com/hamuhamu/gmake

最近読んだ本

GNU Make 第3版

GNU Make 第3版

[改訂新版] シェルスクリプト基本リファレンス  ??#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

[改訂新版] シェルスクリプト基本リファレンス  ??#!/bin/shで、ここまでできる (WEB+DB PRESS plus)

覚えて便利 いますぐ使える!シェルスクリプトシンプルレシピ54

覚えて便利 いますぐ使える!シェルスクリプトシンプルレシピ54