この記事は、SLP_KBITその2 Advent Calendar 2016の14日目の記事です。
はじめに
Railsでアプリ開発を行う際に、テスト用の設定ファイルやTwitterbootstrapを使うために色々と書いたり、他のアプリからコードをコピペしたり、実際にコードを書き始めるまでの準備にとても時間がかかる場合があると思います。
その手間を軽減するために、RailsにはApplication Templateという機能があります。
しかし、Sinatraには、自分が調べた限りでは、このような機能はありませんでした。
そのため、Sinatraを軽量なRailsのように扱いたいと思っていました。
Sinatraのメリット
Ruby使いがWebアプリを作る、となるとRailsが一番に思い浮かぶと思います。
しかし、数時間規模のハッカソンやデモ用のアプリ開発などでは、Railsは大げさでちょっと……という方もいらっしゃるのではないでしょうか。
個人的には、モデルが存在しない or 静的なモデルしか存在しない場合にはRailsよりもSinatraを使ったほうがスリムなアプリ開発が行えるのではないかと考えています。
SinatraTemplateとは
主な機能としては、テストやアセットまわりの、アプリ開発する上で必須の設定をあらかじめ用意したものになります。
RailsのApplication TemplateのSinatra版のようなものを目指しています。
ソースコードはこちら (https://github.com/gembaf/sinatra_template) にあります。
ディレクトリ名などは、Railsを参考にしています。
まずは、ざっくりと使い方を説明したいと思います。
使い方
流れとしては、以下のようになります。
- SinatraTemplateをcloneする
- 自身のリポジトリとして名前やremoteなどを変更する
- 自身のリポジトリとしてpushする
clone後のリポジトリの初期化用として、init.sh
を用意しています。
実行すると以下のような処理が行われます。
- ユーザ名とリポジトリ名の入力を求める
- 上記の情報を基に、SinatraTemplateのコード上に存在するユーザ名とリポジトリ名を書き換える
- SinatraTemplateのgitの履歴を消す(
rm -rf .git
) - 自分自身(
init.sh
)を削除する
このスクリプトの実行後には、gitの管理下にないSinatraTemplateが残ることになります。
その後は、自分のリポジトリとして扱えば、色々と用意の整った状態でfirst commit
できます。
テストまわり
テスト関係は、rspec
とfactory_girl
というRailsでもメジャーな組み合わせを導入しています。
さらに、capybara
とpoltergeist
も導入しているので、UIのテストも可能です。
また、コードの品質評価として、rubocop
も導入しています。
アセットまわり
JavaScript関係のライブラリの管理はbower
を利用しています。
デフォルトで使用しているライブラリは、jquery
、bootstrap
、bootswatch
です。
アセットまわりの記法としては、coffee
とsass
をデフォルトとしています。
もちろん、変更の度にコンパイルをする必要はなく、Railsと同じような感じで使うことができます。
Model
初めの方で述べた通り、モデルとして扱うデータは、静的なデータを想定しています。
動的なデータをDBで扱うようなものは、Railsを使うべきだと思います。
ユニットテストの例も兼ねて、UserAgentの判別を行うモジュールのみ、あらかじめ用意してあります。
View
Railsと同じように、layoutファイルを用意しているので、全体的な見た目を統一することができます。
デフォルトで、ナビゲーションバーを表示するようにしています。
herokuへのデプロイ
herokuへデプロイするための設定も整えているので、以下の流れでデプロイできます。
$ heroku create
$ heroku config:set BUILDPACK_URL=https://github.com/heroku/heroku-buildpack-multi.git
$ git push heroku master
外部サービス
circleci
とcodeclimate
に必要な設定ファイルを用意しているので、自分のリポジトリとして各サービスで設定するとそのまま使えます。
おわりに
SinatraTemplateは、自分用として作っているので、まだまだ作りが甘い部分が多々あります。
今後は、ユーザが必要な機能やライブラリを選択して、それ以外のものについては、初期化の段階で削除できるような機能をつけたいと思っています。
あと、今回は生のSinatraを触ったことで、Railsのスゴさを改めて感じることができました。