コマンド一つでテンプレートから環境を構築する為のシェルスクリプトを書く
例えばTypeScriptなどで書き殴りのコードを書きたい時、
自分の場合、yarn init -yしてyarn add -D typescript @types/nodeして、index.tsを作ってtsconfig.jsonを適当に作って書き換えて、package.jsonにnpm-scriptsを書き足して・・・みたいな事をしています。
前に書いたコードを引っ張ってきたら良いじゃんって言うのはごもっともですが、無駄なパッケージが削ぎ落とされたコードを探したり編集したりするのはめんどくさいです。
環境構築の為のツールは公式、サードパーティ問わずたくさん存在しているのでそちらを使っても良いのですが、ゴテゴテしていることが多いので、今回はオレオレテンプレートを自分で管理・編集したいと思ったのでシェルスクリプトで作ってみました。
よかったら使ってみて下さい。
やりたいこと
templateディレクトリを作り、その配下のディレクトリをテンプレートとして選択できるようにする
選択したテンプレートの中身を作業中のディレクトリにコピーする
実装
準備
$HOMEディレクトリにシェルスクリプト用のディレクトリを作り、その中にtemplateディレクトリを作成します。
code:shell(console)
$ mkdir "${HOME}/.sh" && mkdir "${HOME}/.sh/template"
このtemplateディレクトリ内に、使い回したいテンプレートをディレクトリごと入れていきます。
シェルスクリプト用のディレクトリ配下にシェルスクリプトを作り、書いていきます。
code:shell(console)
$ touch "${HOME}/.sh/main.sh"
スクリプトを書いていく
code:main.sh(Bash)
function tepy () {
# メイン処理
}
読み込み時に実行されてしまうのでスコープで囲う。
この関数名がコマンド名になるので入力しやすい物にしとく。
今回はTemplate-Copyなのでtepyと名付けました。
code:main.sh(Bash)
template_path="${HOME}/.sh/template"
echo "Not found template directory."
mkdir $template_path
return
fi
if [ ! $hoge ]でNOT条件、if [ -d ${DIR} ]で、ディレクトリの存在確認ができ、
エラーハンドリングとして、templateディレクトリが存在するかチェックし、存在しなかったら生成します。
code:main.sh(Bash)
template_list=()
for template in find $template_path -maxdepth 1 -mindepth 1 -type d; do
template_list+=${template##*/}
done
hoge=()でbash 配列を作ります。
テンプレートを列挙する為に、findで"${HOME}/.sh/template"内のディレクトリを探します。
オプションとして-type dを付けるとディレクトリのみが検索でき、-maxdepth 1 -mindepth 1でtemplate本体を含まない一層目までの子ディレクトリを検索します。
取得したデータはpathになっているので、template名としてディレクトリ名が欲しいので、##*/で左から最長の/を探し、削除。配列に追加します。
code:main.sh(Bash)
if [ ${#template_list@} -gt 0 ]; then # メイン処理
else
echo "Not found tempate. pls add a directory."
open $template_path
fi
テンプレートが存在しない時はメッセージを出し、追加する様にopenコマンドでディレクトリを表示します。
${#array[@]}で$arrayのlengthが取得でき、if [ ${#array[@]} -gt 0 ]で${#array[@]}が0より大きいか条件分岐しています。
code:main.sh(Bash)
PS3="Please select a number: "
select i in $template_list; do
cp -i -r -v find "${template_path}/${i}" -maxdepth 1 -mindepth 1 "$pwd"
echo "Copying of ${i} completed."
else
echo "Cannot select ${REPLY}. Please select a number."
fi
break
done
PS3変数を変更するとselectなどのプロンプトの表示が変更できるので、番号以外を入力されない様に変更。
select i in $arrayで簡易的な対話メニューが作れる。
入力を受け付けると$iにはテンプレート名が、$REPLYに入力した値が代入される。
エラーハンドリングとしてif [ -n $hoge ]で$hogeの存在チェックをし、存在しない物を入力した際にはメッセージを出す。
存在した場合、findで指定したテンプレートのディレクトリ配下のファイルなどを、作業中のディレクトリにコピーする。
コード全体
code:main.sh(Bash)
function tepy () {
template_path="${HOME}/.sh/template"
template_list=()
echo "Not found template directory."
mkdir $template_path
return
fi
for template in find $template_path -maxdepth 1 -mindepth 1 -type d; do
template_list+=${template##*/}
done
if [ ${#template_list@} -gt 0 ]; then PS3="Please select a number: "
select i in $template_list; do
cp -i -r -v find "${template_path}/${i}" -maxdepth 1 -mindepth 1 "$pwd"
echo "Copying of ${i} completed."
else
echo "Cannot select ${REPLY}. Please select a number."
fi
break
done
else
echo "Not found template. pls add a directory."
open $template_path
fi
return
}
PATH を通す
PATHを通す為に、.zshrcもしくは.bashrcにsource "${HOME}/.sh/main.sh"を記述し、保存したら、source "${HOME}/.zshrc"もしくはsource "${HOME}/.bashrc"で再読み込みします。
実行
上記で関数名を命名した様に、tepyコマンドで呼び出せます。
templateディレクトリに適当にテンプレートにしたいディレクトリを作成し、tepyコマンドを打ちます。
例:
code:shell(console)
$ tepy
1) typescript 2) react
Please select a number: 1
やった!ぱぱぱっと環境構築ができました!
これでTypeScriptをもっと書き殴っていこうと思います。
参考