RSpec+Sporkでテストを高速化する方法
いまさらすぎる話題ですが、Rails初心者の私にとっては新鮮な話ですので、ご勘弁ください。。。
RSpecでテストを書いてて「やけに遅いな〜こんなものか」と思っていたのですが、Sporkなるものがあるらしいですね。 ということで設定してみました。
設定方法
Gemfileに書く
とりあえずGemfile
を編集します。
rspec-rails
とspork-rails
を書きます。
group :development, :test do
gem 'rspec-rails'
gem 'spork-rails'
end
インストールする
有無を言わさずインストールします。
$ bundle install
RSpecを初期化する
すでにしていれば問題ないですが、していないとSpork設定時に怒られるので……。
これをやると、spec/spec_helper.rb
が生成されます。
$ bundle exec rspec:install
Sporkを初期化する
つぎにSporkの設定ファイルを生成します。
これをやると、spec/spec_helper.rb
が勝手に編集されます。
$ bundle exec spork --bootstrap
設定ファイルを編集する
spec/spec_helper.rb
を開いて、RSpec生成時に書いてあった設定をSpork.prefork do
〜end
の中に書きます。
Spork.prefork do
# ここに書く
end
Spork.each_run do
end
.rspecを編集する
Sporkを使うには、bundle exec rspec --drb
とすればよいです。
ただ、毎回--drb
をつけるのも面倒なので、標準でつけるようにします。
これは、Railsのルートディレクトリにある.rspec
に書きます。
--color
--drb
使用方法
Sporkを起動する
ようやく設定が終わったので、Sporkを起動します。
$ bundle exec spork
テストする
この状態でRSpecでテストすると、ものすごくはやいです。
$ bundle exec rspec
注意
Sporkはもろもろの設定を事前に読み込んでおくためにテストが高速化されます。
なので、config/routes.rb
などを編集したら、Sporkを再起動しなければなりません。
この辺自動リロードなどもできると思いますが、ちょっと疲れたので今度にします。。。
Gitで直前のコミットを取り消す方法
私はよくやらかしてしまう人なのです。 なので、直前のコミットを取り消すこともしばしばです。
ですが、そのやり方を忘れることもしばしばです。 なので、その方法についてまとめます。
コミットを取り消す方法
コミットのみを取り消す
コミットのみを取り消すには、git reset --soft
を用います。
$ git reset --soft [commit]
直前のcommit
はHEAD^
に格納されるので、直前のコミットを取り消すには以下のように書きます。
$ git reset --soft HEAD^
ファイルの変更も取り消す
ファイルの変更内容すらも取り消したい場合は、--soft
ではなく--hard
を用います。
これを意図せずにやってしまうと大変なことになる(と思う)ので、気をつけます。
$ git reset --hard HEAD^
もっとGitを優雅に使えるようになりたいものです。
git remoteの使い方
git remote
関連をつかっているときに頭がごちゃごちゃになってきたので、一度整理してみました。
基本的な使い方のみまとめてみます。
git remoteのコマンド
リモートリポジトリの一覧を表示する
リモートリポジトリの一覧を表示するには、そのままgit remote
と打ちます。
詳細を確認するには、-v
オプションをつけます。
$ git remote
$ git remote -v
リモートリポジトリを追加する
リモートリポジトリを追加するにはadd
コマンドを使います。
GitHubを使うときによくやる、アレです。
$ git remote add [name] [url]
リモートリポジトリを削除する
削除するときはrm
を使います。
$ git remote rm [name]
以上でござる。
参考記事
bundle installでのGemのインストール先を変更する方法
単純にbundle install
すると、インストールしたGemがシステム全体に影響することになります。
rbenv
などでRubyをインストールしていればいくらかマシですが、でもやっぱり気になります。
A型だもの。
ということで、Gemのインストール先を変更してみます。
方法(1):オプションを指定する
bundle install
実行時に、Gemのインストール先を指定することができます。
方法は以下のとおりです。
$ bundle install --path vendor/bundle
方法(2):設定ファイルにインストール先を書いておく
(1)のやり方を毎回打つのは面倒です。 そこで、インストール先を設定ファイルに書いておきます。
Bundlerのドキュメントを見ると、.bundle/config
に書けばよいらしいです。
$ mkdir .bundle
$ vi .bundle/config
config
の中身は以下のとおりです。
---
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: '1'
設定できたかどうかは、bundle config
で確認することができます。
$ bundle config
いつも書き方を忘れるので、まとめてみました。。。
追記:2013/12/29
方法(1)のやり方で一度実行すると、勝手に.bundle/config
が生成されるみたいですね。
ということで、方法(2)は(゚⊿゚)イラネ
RailsプロジェクトをHerokuにデプロイする方法
いまRailsの勉強をしているのですが、試しにHerokuにデプロイしてみました。 その方法を簡単にまとめてみます。
Railsの準備
プロジェクトを作成する
rails new
するだけです。
$ rails new hoge
Gitにコミットする
HerokuはGitを使うみたいなので、その準備をします。 Herokuを使うだけなら、特にリモートリポジトリを準備する必要はありません。
$ git init
$ git add .
$ git commit -m 'first commit'
Gemfileを編集する
ここで結構はまりました。
RailsはデフォルトでSQLiteを使うようになっているのですが、HerokuはPostgreSQLを使います。
それだけならまだしも、Gemfile
にgem 'sqlite3'
が残っていると、以下のエラーが表示されます。
Installing sqlite3 (1.3.8)
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.
/tmp/build_fe2767bf-8ae8-4b42-86f1-6f1536d20723/vendor/ruby-2.0.0/bin/ruby extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'port install sqlite3 +universal'
or 'yum install sqlite-devel' and check your shared library search path (the
location where your sqlite3 shared library is located).
そうならないために、:development
と:production
(Heroku)で分けます。
$ vi Gemfile
group :development do
gem 'sqlite3'
end
group :production do
gem 'pg'
gem 'rails_12factor'
end
gemをインストールする
あとはgem
をインストールします。
このとき、--without
オプションで、本番環境用のgem
をインストールしないようにします。
$ bundle install --without production
コミットする
以上の変更をコミットします。
bundle install
したときにGemfile.lock
が追加されているので、それをよしなに反映させましょう。
$ git add .
$ git commit -m 'add Gemfile.lock'
Herokuにデプロイする
ユーザ登録する
なによりまずはユーザ登録をします。
コマンドをインストールする
つぎに、Heroku Toolbeltというものをインストールします。 これがないといろんなコマンドがつかえないのです。
ログインする
次のコマンドで、ログインします。
$ heroku login
Heroku上にリポジトリを作成する
Railsのルートディレクトリ上で、create
コマンドを実行します。
すると、Heroku上にリポジトリが作成されます。
$ heroku create
create
すると、Herokuのサブドメインが与えられます。
あとはPushするだけでデプロイ完了、ということです。
Pushする
それではさっそくPushしましょう。
リモートリポジトリにはheroku
を指定します。
$ git push heroku master
ちなみにどんなリモートリポジトリがあるかはgit remote -v
で確認できます。
表示を確認する
ブラウザでURLを指定してもよいのですが、以下のコマンドを打てば自動でブラウザを開いてくれます。 親切すなぁ。
$ heroku open
以上でした。 ちなみにSQLiteのくだりで数時間はまってました。。。Orz
Vagrantのsaharaプラグインの使い方
ChefとVagrantでいろいろよろしくやっていると、Vagrantを何度も初期化することになります。 というか、初期化したくないけど、レシピを適用する前に戻りたくなります。
そんなときに便利なのがsahara
というプラグインです。
この使い方についてメモしておきます。
saharaの使い方
インストール方法
以下のコマンドをターンッとたたくだけです。
$ vagrant plugin install sahara
各種コマンド
一般的な使い方としては、まずon
して、大きな変更を加える前にcommit
して、いろいろよろしくやり、戻したくなったらrollback
します。
いろいろよろしくやって、その変更を覚えておきたい場合は再度commit
し、いらなくなったらoff
します。
実行
$ vagrant sandbox on
コミット
$ vagrant sandbox commit
コミット時に戻す
$ vagrant sandbox rollback
終了
$ vagrant sandbox off
注意
起動したままcommit
すると、かなり時間がかかってやばいです。
そんなときは、一度halt
しましょう。
Chef SoloでVagrant上にrbenv環境をつくったけどgem installがうまくいかない場合の対処法
以前、Chef SoloでVagrant上にrbenv
の環境をつくりました。
ただ、この方法では、rbenv/versions
のグループがroot
となります。
そのため、vagrant
ユーザでgem install
してもこうなってしまいます。。。
[vagrant@localhost ~]$ gem install bundler
Fetching: bundler-1.3.5.gem (100%)
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /usr/local/rbenv/versions/2.0.0-p353/lib/ruby/gems/2.0.0 directory.
これを解決してみます。
解決方法
権限を変更する
上のエラー文では、「rbenv/versions/〜
に書き込み権限がないよ!」と言われているようです(適当)。
じゃあ、とりあえず変えてみましょう。
/usr/local/rbenv
下すべてのグループをrbenv
グループにして、さらにrbenv
グループに書き込み権限を与えます。
$ sudo chown -R :rbenv /usr/local/rbenv
$ sudo chmod -R 775 /usr/local/rbenv
gem installする
以上でOKです。
これで、試しにgem install bundler
すると……。
[vagrant@localhost ~]$ gem install bundler
Fetching: bundler-1.3.5.gem (100%)
Successfully installed bundler-1.3.5
Parsing documentation for bundler-1.3.5
Installing ri documentation for bundler-1.3.5
1 gem installed
きたこれ!
補足:Chefのレシピで書く
これをChefでやると、以下のようになると思います。
何度も実行しないように、rbenv/versions
のグループがrbenv
じゃないときだけ実行するようにnot_if
などを書いてみます。
execute 'change owner and mode' do
not_if "ls -ld /usr/local/rbenv/versions | awk '{ print $4 }' | grep rbenv"
command 'chown -R :rbenv /usr/local/rbenv; chmod -R 775 /usr/local/rbenv'
end
以上なのです。