cli image

前回の記事 で Rails の Application Template を使ってみました。

それでも Rails プロジェクトを立ち上げるには手数が多く面倒だったので peco を使ってテンプレートを選択し初期化しようと思います。

仕組み

  1. GitHub に Application Template を管理するリポジトリを用意
  2. GitHub API を使って該当のリポジトリからテンプレート一覧を取得
  3. peco を使ってテンプレートを選択
  4. ローカルで 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 を使う都合でいくつか不都合があります。

  1. bundle install 時にローカルに gem をインストールする
  2. DB の設定を常に MySQL に固定