What have you found for these years?

2012-09-12

Save myself from bundler

It always bothers me that bundler's user configuration has different semantics
than project configuration. By user configuration, I mean the file located at:
~/.bundle/config. By project configuration, I mean the file located at:
PROJECT_ROOT/.bundle/config.

(well, it also bothers me a lot that sometimes it's called bundler,
and sometimes it's called bundle)

The difference is that project configuration would respect ruby_scope (in
bundler's term), while user configuration would not. This troubles me a lot.
If it's the reversed way, then I guess I can accept the inconsistency, since
I can just forget about project configuration, and setup user configuration
once and for all.

The problem is that bundler won't respect ~/.gemrc, so it ignores my --user option:

gem: --user --env-shebang --no-rdoc --no-ri
It would always try to install gems to the system. No please, don't ask me
to change GEM_PATH or GEM_HOME, otherwise I would be messing up with
other rubies as well (and ENV). I just want that simple --user option....

I guess I might be the only one who is using user gems. By user gems, I mean
I install all my gems into ~/.gem/ruby/1.9.1 and ~/.gem/jruby/1.9 and
~/.gem/rbx/1.9. That's exactly what --user would do. I don't install gems in
my system, *at all*, and I don't use RVM, *at all*.

So I must have a config to tell bundler to install to the right place. This raises
another issue, I need it to respect ruby_scope. But only project configuration
would respect ruby_scope, not the one resides in ~/.bundle/config. If you're
copying project config to user config, or the other way around, you might be
installing to unexpected place.

I ended up with setting my ~/.bundle/config to point to /tmp because it just
didn't work at all, and whenever I restarted my computer, the wrongly installed
stuff would be cleaned up. Whenever I realize that it's installing to a wrong
place, then I would frustratedly copy my last working project config to the newly
created project. This is causing more troubles when `rails new` would try to
run `bundle install`...... a chain of shits.

I couldn't stand anymore, digging into the source, sending this pull request.
lib/bundler/settings.rb: Always respect Bundler.ruby_scope
Well, I am not too optimistic if they would merge it, since apparently the
inconsistency is designed for, not really a bug. I did see there are some
tests which would make sure this inconsistency won't break...

That's why my pull request didn't pass Travis' verification. I am not going
to fix it because they might not like the consistency I am looking for,
and I don't want to waste my time fixing something which would never
going to be merged. I would definitely be glad to fix it if they promise to
fix this inconsistency.

At last, I decided to save myself, by patching bundler on my own computers.
So here's the exact monkey patch. bundler/monkey.rb
Whenever I run `bundle`, it would first try to load the monkey patch.
This is enough for my Mac, but I need another patch for my Linux,
I am not sure why. Whenever someone does require 'bundler/setup',
it would also first grab the monkey first. This is needed for my Linux.
Then I set RUBYOPT=-I~/.config/bundler in my ~/.bash_profile for my Linux.

Perfect, now everything works as expected.
Oh, it's only perfect if I don't have to look into it again, in the future.

I am not very optimistic about this either.

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0