Почему prawnto gem устанавливает рельсы 3.x, когда уже есть рельсы 2.x?
Я имею rails
(2.3.5) и prawn
(0.12.0) установлен. Когда я устанавливаю prawnto
, драгоценный камень устанавливает rails
Версия 3.2.6 также.
Зависимость prawnto
является:
prawn >= 0
rails >= 2.1
Зачем gem устанавливать Rails 3.x когда prawnto
зависимость уже есть?
1 ответ
tl;dr Используйте Bundler. Это круто.
Хорошо, это в основном связано с тем, как работает разрешение зависимостей в RubyGems. Если вы не очень хорошо знакомы с ним, начните быстро набирать скорость, как с панелью Primer из этого комикса XKCD. Управление зависимостями RubyGems и сюжетная линия Primer очень похожи по сложности.
Когда драгоценный камень определяет зависимость, скажем, rails >= 2.1
когда вы собираетесь установить этот гем, RubyGems удобно игнорирует все гемы, которые вы в данный момент установили, а затем запрашивает веб-API, чтобы найти абсолютную последнюю версию Rails, которая больше или равна 2.1
,
На момент написания статьи он найдет версию 3.2.6
и поэтому должным образом установит эту версию Rails, потому что она соответствует требованиям зависимости. Он также установит все зависимости Rails, их зависимости и sub-sub-sub-sub-зависимости до тех пор, пока не останется драгоценный камень без установленной зависимости.
Я не буду вдаваться в подробности о том, как это работает, потому что это делает мое зрение размытым, когда я думаю об этом.
Теперь, если бы вы использовали что-то, что не является чисто RubyGems, например, Bundler, у вас был бы такой Gemfile:
source 'http://rubygems.org'
gem 'rails', '2.3.4'
gem 'prawnto', '0.1.1'
А потом беги bundle install
и тогда случится что-то волшебное. Bundler выяснит зависимости для всех драгоценных камней, указанных в Gemfile
, а также драгоценные камни, от которых они зависят, а затем установить только эти драгоценные камни.
Это означает, что если у вас есть prawnto
желая рельсы >= 2.1
, он не установит 3.2.6, потому что есть другая зависимость, говорящая, что Rails должен быть точно 2.3.4
, Поэтому Rails 2.3.4 будет установлен.
Если у вас есть конфликтующие версии, с гемом A, указывающим зависимость от гема B, ~> 1.0
, но затем gem C, указывающий зависимость, что gem B должен быть = 0.5.0, Bundler не будет очень счастлив и выдаст ошибку, потому что зависимости не могут быть разрешены.
Я действительно рекомендую использовать Bundler для всех ваших Rails-проектов. Даже те, которые работают на Rails 2. На веб-сайте Bundler есть страница, которая поможет вам начать работу с проектом Rails 2.3 и Bundler.