Начиная с Ruby on Rails.Как работает Gemfile и как работают гемы при указании версий для загрузки? - PullRequest
3 голосов
/ 20 марта 2012

Я попытался прочитать документацию, но это все еще не было ясно для меня:

Предположим, у меня есть следующие утверждения в моем Gemfile:

source 'https://rubygems.org'

gem 'rails', '3.2.2'

# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

gem 'sqlite3'

gem 'json'

...

Я пытаюсь научитьсякак использовать Ruby on Rails на этом сайте: http://ruby.railstutorial.org/ и там написано, что мне нужно иметь гем sqlite3 для этой версии rails (3.2.2).

У меня такой вопрос: если я не укажу точную версию гема sqlite3 для загрузки системой при запуске bundle install, тогда она установит последнюю версию, которая работает с версией railsи ruby, с которым я работаю (предположим, это 3.2.2 и 1.8.7 p-352 соответственно), или он просто загрузит последнюю доступную версию гема sqlite3, работает ли он с тем, что я установил или нет?

Я не совсем уверен, как работает этот аспект Gemfile, и документация не ясна, или я не нашел, где прямо сказано это или нет.

Ответы [ 3 ]

3 голосов
/ 20 марта 2012

Итак, он установит последнюю версию sqlite3, которая совместима с зависимостями, указанными в других перечисленных вами гемах.

Скажем, rails сказал, что он работает только с sqlite3, который был больше 1.0, но меньше 4.0, он мог бы установить 3.9.5. Я делаю все эти цифры, просто пример.

На самом деле, я не знаю, указывает ли rails какие-либо конкретные версии sqlite3, которые ему требуются. Предположительно, «json» тоже не имеет, поскольку он не имеет ничего общего с базами данных. Если ни один из других перечисленных вами гемов не определяет какие-либо требования для sqlite3, он просто установит последнюю доступную версию.

'bundle install' использует bundler , подробнее о том, как он разрешает зависимости, можно узнать здесь .

Таким образом, bundler загрузит самый последний драгоценный камень, который отвечает требованиям всех других драгоценных камней, перечисленных вами. Допустим, вы перечислили драгоценный камень A, для которого требовался sqlite3 ранее, чем 2.0, и драгоценный камень B, для которого требовался sqlite3 позже, чем 2.1 - «пакетная установка» будет жаловаться и говорить, что он не может удовлетворить их всех.

Это зависит от собственной рекламы драгоценных камней каждого из их собственных требований к другим драгоценным камням, на которые они полагаются. Иногда они могут ошибаться или отсутствовать. Может случиться так, что rails на самом деле не определяет, какая версия sqlite3 ему нужна - поскольку на самом деле вообще не требует sqlite3 (вам не нужно использовать sqlite с rails), это может очень хорошо быть. В этом случае упаковщик не может ничего сделать, кроме как получить последнюю версию sqlite3. Что не гарантирует, что версия будет работать. Но это может сделать только так много.

Вы также упомянули проблему совместимости с конкретными версиями ruby, такими как 1.8.7-p352. Bundler обладает меньшими возможностями, вы вообще не можете рассчитывать на это, зная, какая версия совместима с конкретной версией ruby ​​(потому что у гемов нет отличного способа выразить это так, как его может использовать, увы).

Но в общем все работает. Если вы не знаете или не заботитесь о том, какую версию sqlite3 (или любой другой гем) вы хотите, но знаете, что вы хотите ее - сделайте то, что вы сделали, запустите «bundle install», посмотрите, работает ли она. Это вероятно будет. Если это не так, отправьте сообщение об ошибке в Google, и вы, вероятно, найдете кого-то, объясняющего, почему это не так и что вам нужно сделать вместо этого.

PS: Если этого было недостаточно. sqlite3 является своего рода странным случаем, потому что, хотя Rails предназначен для работы с ним, он не требуется . Но Rails по умолчанию, при создании нового приложения с последней версией rails rails new my_app, уже поместит sqlite3 в ваш Gemfile для вас. И он сделает это так же, как вы, без ограничения версии. Это причина чувствовать уверенность, что все будет хорошо. Обратите внимание, что в rails 3.2.2, rails new my_app добавит в ваш Gemfile некоторые другие вещи, которые do содержат более конкретные версии в списке, например, gem 'sass-rails', '~> 3.2.3', потому что эти вещи совершенно не требуются для Rails ( иначе они будут выражены как требования и не обязательно должны быть явно указаны в Gemfile вашего приложения), установщик rails знает, что будут работать только определенные версии.

1 голос
/ 20 марта 2012

Bundler всегда смотрит на ваш файл Gemfile.lock первым, когда вы делаете bundle install.Если вы откроете этот файл, вы увидите как драгоценные камни, так и версию, используемую вашим приложением.Это удобно для существующих проектов, потому что вы всегда уверены, что любой другой разработчик, вовлеченный в проект, будет работать с теми же версиями гемов.

Если он не найдет этот файл (то есть делает rails new projectname)или указанный камень или версия в Gemfile не соответствует Gemfile.lock, он загрузит последнюю или указанную версию камня.

1 голос
/ 20 марта 2012

Довольно плохо знаком с Rails, так что поправьте меня, если я ошибаюсь.

Gemfile просматривает каталог самоцветов для перечисленных самоцветов и не влияет на их фактическую "установку". Выполнение команды «gem install» без версии приведет к получению последней из перечисленных версий независимо от того, что говорит ваш Gemfile. Когда вы «связываете установку», то именно тогда в вашем каталоге gems происходит поиск конкретной версии.

...