How does Bundler work, anyway? (RubyConf AU 2017)

4c3ed917e59156a36212d48155831482?s=47 André Arko
February 10, 2017

How does Bundler work, anyway? (RubyConf AU 2017)

We all use Bundler at some point, and most of us use it every day. But what does it do, exactly? Why do we have to use bundle exec? What's the point of checking in the Gemfile.lock? Why can't we just gem install the gems we need? Join me for a walk through the reasons that Bundler exists, and a guide to what actually happens when you use it. Finally, we'll cover some Bundler "pro tips" that can improve your workflow when developing on multiple applications at once.

4c3ed917e59156a36212d48155831482?s=128

André Arko

February 10, 2017
Tweet

Transcript

  1. 5.
  2. 7.
  3. 8.
  4. 22.

    $LOAD_PATH = [] def require(filename) full_path = $LOAD_PATH.first do |path|

    File.exist?(File.join(path, filename)) end eval File.read(full_path) end
  5. 26.

    use ruby libraries 1. Find a cool library 2. Download

    the library 3. Untar the library 4. Run `ruby setup.rb all`
  6. 30.
  7. 37.

    “why is this broken in production?” “dunno, it works on

    every developer machine” 3 days of debugging later… “oh, look, one production server has frobnitz 1.1.3, but the others have 1.1.4” “welp. that explains those exceptions ”
  8. 40.

    $ rails s Gem::LoadError: can't activate rack (~> 1.0.0., runtime)

    for ["actionpack-2.3.5"], already activated rack-1.1.0 for ["thin-1.2.7"] activation errors
  9. 43.
  10. 44.

    addressable (2.3.7) arel (6.0.0) bcrypt (3.1.10) binding_of_caller (0.7.2) debug_inspector (>=

    0.0.1) builder (3.2.2) byebug (3.5.1) columnize (~> 0.8) debugger-linecache (~> 1.2) slop (~> 3.6) celluloid (0.16.0) Gemfile.lock
  11. 45.

    bundle install my old friend 1. Read the Gemfile (and

    lock, if it's there) 2. Ask RubyGems.org for a list of every gem we need 2. Find gems allowed by the Gemfile that work together 3. Write down those versions in the lock for future installs 4. Install gems until every locked gem is installed
  12. 46.

    bundle exec everyone’s nemesis 1. Read the Gemfile (and lock,

    if it's there) 2a. Use locked gems if possible OR 2b. Find versions that work to put in the lock 3. Remove any existing gems the $LOAD_PATH 4. Add each gem in the lock to the $LOAD_PATH
  13. 47.

    pro tip no more bundle exec! $ bundle binstubs rspec-core

    $ bin/rspec repeat as needed for other gems