Shibuya.rbで「俺のRails開発環境」という題で発表してきた (資料補足)

ちょっと前にいつだったか、自分の開発環境についてまとめた記事でも書こうかと思っていたんですが、
ついでだからShibuya.rbでLTのネタにしてしまえと、話をしてきました。
ちなみに、今回のShibuya.rbは何か話したい人が居たらどうぞって感じだったのですが、
いつのまにかLT大会になってましたw


内容としては至極一般的な環境だと思いますが、
資料アップしたところ結構反響があったので、
やっぱ人の環境は皆気になってるのかなーと。
後は、これからRails始める人とかかな?

資料の補足

インテグレーションテスト

cucumberを使ってるのは慣れによる所も大きいですが、
今は業務上の理由でコード書く人とテストケース書く人が分離しているので、
request specは使ってなかったりします。
これから始める人は、プログラマーばっかりだったらrequest specの方が早いし楽じゃないかなと思います。

bundler

bundle後のコマンドはbinstubs使う手もありますが、今のところaliasでそんな困ってないので、
PATH書き換えたりとかはやらずに、bundle execでやってます。

spork

普段からRails書いてる人には言うまでもないことですが、
Railsの環境を毎回読み込むとテスト実行のテンポが悪くなるので、
sporkで事前に読み込んで、--drbオプションを付けてテストしています。
ただ、環境を読み込んでプロセス上げっぱなしにしているため、
再読み込みにちょっと癖があります。
それを解消するためのハックがありまして、
私も環境作りなおすたびに忘れるので、以下にメモしておきます。

# spec_helper.rb
Spork.each_run do
  # This code will be run each time you run your specs.
  if Spork.using_spork?
    ActiveSupport::Dependencies.clear
    ActiveRecord::Base.instantiate_observers
  end

  FactoryGirl.reload
end
# config/application.rb

### Part of a Spork hack. See http://bit.ly/arY19y
if Rails.env.test?
  initializer :after => :initialize_dependency_mechanism do
    # Work around initializer in railties/lib/rails/application/bootstrap.rb
    ActiveSupport::Dependencies.mechanism = :load
  end
end


他にもやり方あるようですが、こんな感じで設定しておかないと、
app以下を更新しても反映してくれなかったりします。

pry

私はそれほど使いこなしていないのですが、
pry-stack_explorerや、pry-remote、ruby-debug-pryなど
便利な拡張がいくつかあります。
Shibuya.rbにも参加していたainameさんがブログにエントリを上げてくれていますので、
参考にしたいですね。
http://blog.kiftwi.net/2012/03/20/summary-of-pry-plugins/

zsh

gitをバリバリ使っていると、svnに比べてブランチ間の移動がかなり多くなります。
また、rebase途中で--continue忘れて無名ブランチなどに迷いこんでしまったりすることもあります。
zshvcs_infoはrebaseやmergeなどのアクション中はちゃんと表示してくれるので、
余計なミスをかなり減らしてくれます。
私はrvmで利用しているrubyのバージョンと合わせて以下のように設定しています。

# vcs_infoとrvmで利用しているrubyを表示する
autoload -Uz vcs_info
zstyle ':vcs_info:*' enable git svn hg bzr
zstyle ':vcs_info:*' formats '(%s)-[%b]'
zstyle ':vcs_info:*' actionformats '(%s)-[%b|%a]'
zstyle ':vcs_info:(svn|bzr):*' branchformat '%b:r%r'

autoload -Uz is-at-least
if is-at-least 4.3.10; then
  zstyle ':vcs_info:git:*' check-for-changes true
  zstyle ':vcs_info:git:*' stagedstr "+"
  zstyle ':vcs_info:git:*' unstagedstr "-" 
  zstyle ':vcs_info:git:*' formats '(%s)-[%b]%c%u'
  zstyle ':vcs_info:git:*' actionformats '(%s)-[%b|%a]%c%u'
fi

function _update_vcs_info_msg() {
    psvar=()
    LANG=en_US.UTF-8 vcs_info
    [[ -n "$vcs_info_msg_0_" ]] && psvar[1]="$vcs_info_msg_0_"


    # for rvm
    [ -s $HOME/.rvm/scripts/rvm ] && psvar[2]=`rvm-prompt i v p g s`

}
add-zsh-hook precmd _update_vcs_info_msg

VCS_PROMPT="%1(v|%F{green} %1v%f|)"
RUBY_PROMPT="%2(v| %U%B%F{magenta}(%2v)%f%b%u|)"

RPROMPT="$RUBY_PROMPT$VCS_PROMPT $RPROMPT"
git

git log --graph --all --decorate --oneline -n 20という感じでログ表示すると、
githubのNetworkのようなコミットグラフが端末でもかなり見易く表示できます。
rebase前後は、コミットグラフの確認が必須なので、
aliasを設定して、すぐに叩けるようにしておくと、rebaseも怖くない。

vim

資料に書いてないところで、errormarker, quickrunについては以前、ブログを書きました。
気になる方は以下の記事を見ていただくと活用例が分かると思います。


vimでrubyのコードを保存した時に、シンタックスエラーをチェックして、エラーをハイライトする - joker1007の日記
rspecをvim-quickrunから非同期で実行する - joker1007の日記


unite-grepとqfreplaceは、中々説明するのが難しいですが、
unite-grepを使って、grepの結果をuniteバッファに一覧で表示します。
その中で置換したいファイルをスペースキーでチェックしていき、replaceアクションを呼び出します。
するとquickfixウインドウにgrepで該当した行だけが集まって、一つのバッファで表示されます。
これをvimの置換コマンド等で好きに編集して保存すると、
さっきチェックしたファイルの該当行が全て置換されます。
Vimテクニックバイブルにも載っていたはずですので、
持っている方は参照してみるといいかもしれません。


なんでこれが必要かと言うと、vimにはJavaIDEのようなリファクタリング機能が無く、
IDEを持ち出してきてもRubyでは余り信用できる名称変更とかやってくれません。
なんで、何かの拍子にクラス名とか変えたくなった時に、
対象ファイルを目で確認しながら、一気に置換することができます。
これが無いとリネームで死にかけてただろうってことが、
しばしばあったので、いざって時に覚えておくと役に立つかもしれません。


補足終了。
vimRails書いてる人には特に真新しい内容では無かったと思いますが、
もし参考になるところがあれば、幸いです。