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
:path
sources with:git
or just plain Rubygems sources, - then forget to
bundle update
, - wonder why your git repository is dirty and it's just the modified
Gemfile
andGemfile.lock
, - accidentally commit the
Gemfile.lock
with local:path
sources 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?
wow, thanks for the feedback, people.
@josevalim having both options combined with a env variable could work. but then again devs often times have their local sources in different places which is hard to solve with having everything in one Gemfile and committed.
I love the pre-commit hook idea!
@jonleighton same, the priority source feature would need to allow to set different paths for different devs (and ideally per gem, too, which is one drawback of my solution above ... all the repositories need to be subdirectories of one dir).
@KL-7 yeah, the solution in travis-worker requires to add/delete symlinks in order to switch sources.
Thinking about it I guess if Bundler supported some sort of plugins (like Rubygems does) we'd be good to go. Everybody could monkeypatch away and experiment with different concepts before anything gets added to Bundler itself.