Имеет ли значение порядок драгоценных камней в вашем Gemfile?
Важен ли порядок, в котором вы перечисляете свои драгоценные камни? Эти два блока эквивалентны?
gem 'carrierwave'
gem 'rmagick'
А также
gem 'rmagick'
gem 'carrierwave'
3 ответа
Когда вы используете Bundle.require
(что делает Rails), Gems требуются в порядке их появления в Gemfile. Так было не всегда, но так было некоторое время.
Поскольку Carrierwave требует RMagick явно, когда это необходимо, я не думаю, что это должно иметь значение в вашем случае; но, строго говоря, два блока не эквивалентны.
Bundler не загружает гем-зависимости в том порядке, в котором вы их перечислили*, но он работает по приоритету источника, используя следующие критерии:
Явные параметры пути или git добавляются в зависимость от gem, например:
gem 'some-gem', github: 'somebody/some-gem'
Явно определенные зависимости для драгоценных камней, которые в противном случае неявно требуются от других зависимостей драгоценных камней, т.е.
gem 'actionmailer'
драгоценный камень неявно требуетсяgem 'rails'
Если у вас есть несколько источников, он будет искать от последнего к первому.
См. 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, и никаких проблем ¯_(ツ)_/¯