前回の記事 で Rails の Application Template を使ってみました。
それでも Rails プロジェクトを立ち上げるには手数が多く面倒だったので peco を使ってテンプレートを選択し初期化しようと思います。
仕組み
- GitHub に Application Template を管理するリポジトリを用意
- GitHub API を使って該当のリポジトリからテンプレート一覧を取得
- peco を使ってテンプレートを選択
- ローカルで
rails new
を実行
その他のファイルも管理できるようにテンプレートリ管理リポジトリを用意し専用ディレクトリを作りました。public なリポジトリであれば GitHub API でディレクトリ内のファイル一覧を取得できます。
https://github.com/fillin-inc/templates
コード
以下のコードを .zshrc
でロードし zsh 上で呼び出します。
# peco-rails-template.zsh
function peco-rails-template() {
# GitHub API からテンンプレート情報取得
local JSON=$(curl --silent https://api.github.com/repos/fillin-inc/templates/contents/rails | jq '.[]')
# template 名から選択
local TEMPLATE=$(echo ${JSON} | jq '.name' | grep '.rb' | sed -e 's/"//g' | sed -e 's/\.rb$//' | peco)
if [ -z ${TEMPLATE} ]; then
echo "template が取得できませんでした"
return 1
fi
# name が該当する download_url 取得
local SELECTED=$(echo ${JSON} | jq ". | select (.name == \"${TEMPLATE}.rb\") | .download_url" | sed -e 's/"//g')
if [ -z ${SELECTED} ]; then
echo "選択された template に該当する download_url が取得できませんでした"
return 1
fi
# git 管理されていない場合, 空 commit
if [ -d .git ]; then
git init
git commit --allow-empty -m "initial commit"
fi
# Gemfile が存在しない場合デフォルト適用
if [ ! -f "Gemfile" ]; then
curl -O --silent https://raw.githubusercontent.com/fillin-inc/templates/master/rails/example/Gemfile
fi
# rails gem を install
bundle i --without production
# template 指定で new
bundle exec rails new . --force -d mysql -m ${SELECTED}
}
課題
この処理には Application Template を使う都合でいくつか不都合があります。
bundle install
時にローカルに gem をインストールする- DB の設定を常に MySQL に固定