Почему 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.

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