Имеет ли значение порядок драгоценных камней в вашем Gemfile?

Важен ли порядок, в котором вы перечисляете свои драгоценные камни? Эти два блока эквивалентны?

gem 'carrierwave'
gem 'rmagick'

А также

gem 'rmagick'
gem 'carrierwave'

3 ответа

Когда вы используете Bundle.require (что делает Rails), Gems требуются в порядке их появления в Gemfile. Так было не всегда, но так было некоторое время.

Поскольку Carrierwave требует RMagick явно, когда это необходимо, я не думаю, что это должно иметь значение в вашем случае; но, строго говоря, два блока не эквивалентны.

Bundler не загружает гем-зависимости в том порядке, в котором вы их перечислили*, но он работает по приоритету источника, используя следующие критерии:

  1. Явные параметры пути или git добавляются в зависимость от gem, например:

    gem 'some-gem', github: 'somebody/some-gem'
    
  2. Явно определенные зависимости для драгоценных камней, которые в противном случае неявно требуются от других зависимостей драгоценных камней, т.е. gem 'actionmailer' драгоценный камень неявно требуется gem 'rails'

  3. Если у вас есть несколько источников, он будет искать от последнего к первому.

См. http://gembundler.com/v1.3/man/gemfile.5.html.


*Редактировать: в соответствии с ответом Мэтта, в зависимости от того, что вы пытаетесь сделать (или какие драгоценные камни вы загружаете), порядок МОЖЕТ иметь значение. См. Даже с Bundler ваш заказ драгоценных камней может быть значительным.

Привет из 2022 года с использованием Bundler 2.3.11:

Насколько я знаю, порядок в Gemfile не имеет значения. Документы для Bundler, похоже, не говорят об этом окончательно, но см. ниже.

Пример из реальной жизни:

Недавно мы установили Sidekiq Enterprise, и у драгоценного камня есть зависимость, и у обоих есть зависимость отsidekiq.

от нашего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)

Рубокоп кричал на нас за использованиеsidekiq-proдо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.

Итак, мы попробовали способ Rubocop, и никаких проблем ¯_(ツ)_/¯

Другие вопросы по тегам