When developing an application where you have split out shared functionality to multiple dependent gem repositories can get cumbersome when you
- need to edit the Gemfile in order to swap local
:pathsources with:gitor just plain Rubygems sources, - then forget to
bundle update, - wonder why your git repository is dirty and it's just the modified
GemfileandGemfile.lock, - accidentally commit the
Gemfile.lockwith local:pathsources bundled etc. etc.
So what about this strategy:
A. Create a file .Gemfile.local containing:
base = '..' # might need to tweak this according to your directory layout
instance_eval File.read(File.expand_path('Gemfile'))
B. Change your actual Gemfile to something like this:
base ||= 'git://github.com/travis-ci'
type = base[0, 2] == '..' ? :path : :git
gem 'foo', type => "#{base}/foo"
gem 'bar', type => "#{base}/bar"
C. Add the .Gemfile* to your .gitignore file so that other developers can create their own .Gemfile.local and tweak the base path to their directory layout.
D. Switch between both Gemfiles using export BUNDLE_GEMFILE=.Gemfile.local and export BUNDLE_GEMFILE=Gemfile
Voila. It is acceptably easy to switch between using local vs remote gem sources with just a few lines of code. Switching to local/remote gem sources won't dirty the git repository.
Obviously, if you've changed your Gemfile then you still need to remember to switch to remote gem sources and bundle update once you're done and want to commit/push changes (where you don't gitignore the Gemfile.lock).
What do you think?
I've done added this to my bash profile to support this workflow:
And came up with this Rake task to keep a
Gemfile.localup-to-date with your mainGemfile: https://gist.github.com/2016633Both solutions are still "quick and dirty", but work for me. Any suggestions on optimization welcome (particularly since my shell skills leave a lot to be desired).