2014/06/25

Gemfile.local を使う

source 'https://rubygems.org'
gem 'rails'
# some gems
group :development, :test do
gem 'rspec'
gem 'rspec-rails'
gem 'pry'
gem 'pry-rails'
gem 'pry-byebug'
# some gems
end
group :test do
gem 'poltergeist'
gem 'launchy'
gem 'database_cleaner'
# some gems
end
view raw Gemfile hosted with ❤ by GitHub
例えばこんな Gemfile を書いていて push したら、CI でpry-byebug は Ruby 2.0 以降でないと動かないと怒られた。
ローカルでは、2.1.2だから気が付かなかった。

source 'https://rubygems.org'
gem 'rails'
# some gems
group :development, :test do
gem 'rspec'
gem 'rspec-rails'
gem 'pry'
gem 'pry-rails'
if RUBY_VERSION >= '2.0.0'
gem 'pry-byebug'
else
gem 'pry-debugger'
end
# some gems
end
group :test do
gem 'poltergeist'
gem 'launchy'
gem 'database_cleaner'
# some gems
end
view raw Gemfile hosted with ❤ by GitHub
そこでこんなふうに修正して開発してた。
そしたらある日 binding.pry を消し忘れて push してしまいテストが終わらなかった。

CI が当たり前となった現在、こういう Gemfile は無駄が多いんじゃなかろうか。
pry-byebug などのデバッグツールはテストの時に必須なのではないので、CI時には無視したい。
おそらくそのための機能が group なんだろうけど、環境に応じて bundle install のオプションをあれこれしなければいけないのはちょっとめんどくさい。できれば bundle install と path などの使い慣れたオプションだけで完結させたい。

で、話変わって Redmine には Gemfile.local という仕組みがあって、Redmine の実行と直接関係ない gem を記述する方法が用意されている。
Redmineのインストール — Redmine Guide 日本語訳 によると、Redmine本体は使用しないgem(例: mongrel, fcgi)もロードしたい場合のための仕組みらしい。
せっかくなので、Redmine 以外の開発でも導入してみよう。
source 'https://rubygems.org'
gem 'rails'
# some gems
group :development, :test do
gem 'rspec'
gem 'rspec-rails'
# some gems
end
group :test do
gem 'poltergeist'
gem 'launchy'
gem 'database_cleaner'
# some gems
end
local_gemfile = File.join(File.dirname(__FILE__), 'Gemfile.local')
instance_eval File.read(local_gemfile) if File.exists?(local_gemfile)
view raw Gemfile hosted with ❤ by GitHub
group :development, :test do
gem 'pry'
gem 'pry-rails'
gem 'pry-byebug'
# some gems for debug
end
view raw Gemfile.local hosted with ❤ by GitHub
こんな感じで Gemfile と Gemfile.local を作り、.gitignore に Gemfile.local を指定する。
CI時に不要な gem がダウンロードも読み込みもされることはないし、ローカルの開発ではデバッグできる。
bundle install する時に余計なオプションもいらない。
大体、デバッグツールなどは使い慣れたものが個人個人にあって、誰かの設定に左右されるべきものではない。

ただし、当然デメリットもあってコレを許すということは個人個人の開発環境で差異が出ることを意味する。
なので、余計なトラブルが起こる可能性も多少あがる。
まあ、それは使う使わないの選択の問題であって、仕組みとしてはあったほうが便利だと思う。

0 件のコメント :

コメントを投稿