dee
dee

Reputation: 1898

Does the order of gems in your Gemfile make a difference?

Is the order in which you list your gems important? Are these two blocks equivalent?

gem 'carrierwave'
gem 'rmagick'

And

gem 'rmagick'
gem 'carrierwave'

Upvotes: 29

Views: 6957

Answers (3)

Smitty
Smitty

Reputation: 1935

👋 Hello from 2022 using Bundler 2.3.11:

Ordering in the Gemfile does not matter as far as I know. The docs for Bundler do not appear to say this definitively, but see below.

Real life example:

Recently we installed Sidekiq Enterprise, and the sidekiq-ent gem has a dependency on sidekiq-pro and both have a dependency on sidekiq.

from our Gemfile.lock:

  specs:
    sidekiq-ent (2.5.0)
      einhorn (>= 0.7.4)
      sidekiq (>= 6.5.0)
      sidekiq-pro (>= 5.5.0)
    sidekiq-pro (5.5.0)
      sidekiq (>= 6.5.0)

Rubocop was yelling at us for using sidekiq-pro before sidekiq-ent:

Bundler/OrderedGems: Gems should be sorted in an alphabetical order within their section of the Gemfile. Gem sidekiq-ent should appear before sidekiq-pro.

So we tried it Rubocop's way, and no issues ¯_(ツ)_/¯

Upvotes: 2

Noz
Noz

Reputation: 6346

Bundler doesn't load gem dependencies by the order that you list them*, but it does go by source priority using this criteria:

  1. Explicit path or git options append to a gem dependency, e.g.:

    gem 'some-gem', github: 'somebody/some-gem'
    
  2. Explicitly defined dependencies for gems that are otherwise required implicitly from other gem dependecies, i.e., gem 'actionmailer' gem is implicitly required by gem 'rails'

  3. If you have multiple sources added it will search from last to first.

See https://bundler.io/man/gemfile.5.html#SOURCE-PRIORITY


Edit: As per Matt's answer, depending on what you're trying to do (or what gems you're loading) the order MIGHT matter. See Even with bundler your gem order can be significant.

Upvotes: 10

matt
matt

Reputation: 79723

When you use Bundle.require (which Rails does), Gems are required in the order they appear in the Gemfile. In wasn’t always like this, but has been this way for a while.

Since Carrierwave requires RMagick explicitly when it is needed, I don’t think it should matter in your case; but strictly speaking the two blocks are not equivalent.

Upvotes: 16

Related Questions