Bundler — менеджер для управления gem’ами
Что такое Bundler?
Установка
Устанавливаем эту утилиту как любой другой gem:
gem install bundler
Для Rails 3.0 ничего больше делать не нужно, потому как он используется по умолчанию. А для Rails.2.3.x нужно выполнить следующие шаги. C начала добавить ниже приведенный код в boot.rb перед Rails.boot!:
class Rails::Boot
def run
load_initializer
extend_environment
Rails::Initializer.run(:set_load_path)
end
def extend_environment
Rails::Initializer.class_eval do
old_load = instance_method(:load_environment)
define_method(:load_environment) do
Bundler.require :default, Rails.env
old_load.bind(self).call
end
end
end
end
Далее создать файл preinitializer.rb в директории config/initializers с содержимым:
begin
# Require the preresolved locked set of gems.
require File.expand_path(‘../../.bundle/environment’, __FILE__)
rescue LoadError
# Fallback on doing the resolve at runtime.
require «rubygems»
require «bundler»
Bundler.setup
end
Конфигурирование
После создании нового Rails приложения в версии 3.0 в корне проекта уже существует файл Gemfile, который является конфигом для Bundler’а. Для версий Rails 2.3.x его нужно создать самому. Для этого нужно перейти в директорию проекта и выполнить команду:
В этом файле задаются все необходимые зависимости gem’ов. Рассмотрим какие именно возможности предоставляет данный конфиг файл.
Сперва задается ресурс откуда по умолчанию будут устанавливаться gem’ы:
Как уже многие знают ресурс gemcutter.org становится неким стандартом для хранения gem’ов, поэтому при создании конфига именно этот ресурс будет установлен по умолчанию. Но вы легко можете его заменить допустим на gems.github.com или добавить столько ресурсов сколько вам нужно:
source ‘http://gemcutter.org’
source ‘http://gems.github.com’
source ‘http://gems.rubyforge.org’
Далее уже идет список gem’ом которые нужны для работы приложения:
gem ‘will_paginate’
gem ‘oauth’
gem ‘money’
Здесь нужно отметить, что gem’ы можно объединять в группы и далее устанавливать только определенные группы:
group :development do
gem ‘rspec’
gem ‘populator’
gem ‘faker’
end
group :production do
gem ‘memcache-client’
end
Доступна и другая форма объединения gem’ов в группы:
gem ‘rspec’, :group => ‘development’
gem ‘populator’, :group => ‘development’
gem ‘memcache-client’, :group => ‘production’
По умолчанию все gem’ы включаются в группу default.
Если нужна именно конкретная версия gem’а то можно задать ее номер:
gem «rack», «1.0.1»
gem «rails», «>=2.3.2»
Есть возможность задать имя файла который будет подключен во время подключения библиотеки Bundler’ом. По умолчанию это имя gem’а поэтому в большинстве случаев ничего задавать не нужно. Опция которая позволяет задать имя файла для подключения называется require, используется она следующим способом:
gem ‘gchartrb’, :require => ‘google_chart’
В случае если нужно указать git репозитория для скачивания gem’а то нужно использовать опцию git:
gem ‘will_paginate’, :git => ‘git://github.com/mislav/will_paginate.git’
Использование
Как тока задали все нужные gem’ы, нужно выполнить команду:
Эта команда решит все зависимости и установит недостающие gem’ы. При этом если выполнить:
То вы там не увидите gem’ы которые были установлены с помощью bundler’а. Все установленные gem’ы находится в директории
/.bundler. Откуда он их и будет подключать.
Посмотреть список установленных gem’ов можно с помощью команды:
Если нужный gem уже установлен в системе, то для него будет создана ссылка. После каждого изменения файла Gemfile, нужно выполнить команду install. Папка
/.bundler не является обязательной, если вы хотите установить gem’ы в другую папку, это легко сделать:
Если помните, то в конфиг файле есть возможность включать все gem’ы в группы, так вот при установки можно указать какие группы gem’ов не устанавливать:
bundle install —without test
Допустим зачем устанавливать gem’ы на production server который нужны только для тестирования.
Если gem имеет исполняемые файлы, то их можно запускать след образом:
bundle exec cassandra_helper cassandra
Как только вы закончили разработку приложения, нужно заблокировать изменение Gemfile:
После выполнения данной команды создастся файл Gemfile.lock, который будет содержать все зависимости на основе установленых gem’ов у вас на компьютере. Это делается для того чтоб зафиксировать версии gem’ов при которых приложение работает корректно. Данный файл будет иметь следующий вид:
—
dependencies:
faker:
group:
— :development
version: «>= 0»
memcache-client:
group:
— :test
version: «>= 0»
sqlite3-ruby:
group:
— :default
version: «>= 0»
oauth:
group:
— :default
version: «>= 0»
specs:
— stomp:
version: 1.1.4
— populator:
version: 0.2.5
— json:
version: 1.2.0
— thrift:
version: 0.2.0
— thrift_client:
version: 0.3.3
— rspec:
version: 1.3.0
— ruby-hmac:
version: 0.4.0
— oauth:
version: 0.3.6
hash: 0ac3c8666943a1e2294be2851316d83791479451
sources:
— Rubygems:
uri: gemcutter.org
В bundler’е предусмотрена возможность упаковки gem’ов:
После выполнения данной команды в директории vendor/cache будут сохранены все нужные gem’ы, впоследствии чего установка gem’ов будет происходить именно с этой директории. Эта опция будет полезна только для тех у кого нет возможности на production server устанавливать gem’ы с публичных репозиториев.
Вот и все, что я хотел вам рассказать об этой удобной утилите. Попробуйте поработать с ней хотя бы час и я думаю, она вам понравится.
Bundler: Вы должны использовать Bundler 2 или выше с этим файлом блокировки
Я работаю с герокой, и каждый раз, когда я пытаюсь нажать мое приложение, это сообщение показывает:
В нем говорится: «Пульт:! Вы должны использовать Bundler 2 или больше с этим файлом блокировки. ‘
Не знаю, что делать, я попытался удалить пакет и установить его снова, я errased в Gemfile.lock и набрав bundle снова
ОТВЕТЫ
Ответ 1
Я удалил проект и сделал клон git из приложения Heroku, не знаю, является ли это хорошим решением, но это сработало для меня.
Ответ 2
Немного опоздал на вечеринку, но сегодня я столкнулся и с этим, и это решение избавляет от необходимости удалять Bundler: просто запустите
согласно обсуждению проблемы Bundler здесь.
Ответ 3
У меня была такая же проблема на локальной машине (разработка) as-
Вы должны использовать Bundler 2 или выше с этим файлом блокировки.
Проблема была с gemfile.lock, потому что моя локальная версия пакета и версия пакета проекта не совпадали! Вот solution-
Ответ 4
У меня был похожий опыт.
Вот как я это решил
Отобразите список всех ваших локальных драгоценных камней для комплекта драгоценных камней
N/B: команда выше для менеджера версий rbenv, команда для rvm может отличаться
При этом отобразятся версии пакета, установленного локально.
если у вас нет установленной версии 2, то запустите
если у вас уже установлен пакет 2, установленный локально, или вы только что установили его, то вам нужно просто установить обновление для менеджера пакетов RubyGems локально. Для этого запустите
А потом, наконец, запустить
Надеюсь, это поможет.
Ответ 5
После этого работает git push heroku master работает!
Ответ 6
Ответ 7
Даже при наличии в системе пакета 2 эта ошибка по-прежнему возникает при развертывании приложения с Ruby 2.6, поскольку Ruby 2.6 поставляется с версией пакета по умолчанию.
Если вы используете Ruby 2.6, обновитесь до Ruby 2.6.1, чтобы избежать этой проблемы.
Ответ 8
Для локальной системы
Не удаляйте ваш Gemfile.lock для этого, там по причине.
Ответ 9
Heroku не использует Bundler 2.0, но 1.15.2, как указывает tracelog.
Насколько я знаю, «обходной путь» заключается в создании собственного buildpack-пакета или простого собственного форка:
Откройте lib/language_pack/ruby.rb в вашем редакторе и измените следующую строку:
Обновление: Начиная с Ruby 2.6.1 и Bundler 2.0.1, Heroku теперь поддерживает Bundler 2.0.1. https://devcenter.heroku.com/articles/bundler-version#known-upgrade-issues
Это не относится к Ruby 2.6.0, так как это неправильно вызывается из binstubs, как упомянуто в комментарии @Schneems. Он любезно сообщил об этом как Ruby Bug # 15622
Ответ 10
У меня такая же проблема для Ruby 2.6.3, ничто из перечисленного в ответах не могло помочь. У меня работало только следующее решение:
bundle update rails
Ответ 11
запустите эту команду и нажмите код на герою
heroku buildpacks:set https://github.com/bundler/heroku-buildpack-bundler2
Ответ 12
Я получил ту же проблему в моей локальной системе, моя версия ruby была низкой, из-за которой произошла ошибка. Исправлено путем переключения на обновленные версии ruby.
Ответ 13
Обнаружил нечто похожее на проект рельсов.
Возможно, на локальном компьютере нет совместимой версии пакета (до версии 2.xx), которая помечает ошибку.
Ответ 14
Для людей , которые не используют Heroku:
Я перепробовал все, и я все еще получал эту ошибку. даже эта ссылка мне не помогла: https://github.com/jekyll/jekyll/issues/7463
Так что это было мое решение:
Для этого вы можете использовать этот ответ: Как установить версию Ruby по умолчанию с RVM?
Ответ 15
Ответ 16
Ответ 17
Попробуйте это, если все еще есть проблема.
Управляем версиями с помощью Bundler
Недавно вышло обновление rake с версии 0.8.7 до версии 0.9.0, которое наделало много шума в сообществе и в очередной раз выявило проблему управления версиями. Мне бы хотелось прояснить ситуацию и снова проговорить основные моменты, которые я уже упоминал во времена релиза Bundler 1.0. Вначале я расскажу о простых правилах работы, а затем слегка углублюсь в детали.
Простое управление версиями
Исполняемые файлы
Когда вы устанавливаете гем, Rubygems создает обертки для всех исполняемых файлов, идущих в комплекте с гемом. При запуске обертки, запускается Rubygems, который подключает сам гем с помощью стандартного механизма активации. Rubygems запустит самую свежую версию гема, установленную в системе, даже если в Gemfile.lock указана другая версия. Кроме того, будут активированы последние (совместимые) версии всех зависимостей гема, даже если в Gemfile.lock указаны другие версии.
Это означает, что запуск исполняемых файлов как простых команд просто минует Bundler и все залоченые им зависимости. Иногда это не проблема, поскольку у разработчиков скорее всего стоят как раз нужные версии всех гемов. Долгое время Rake был отличным примером такого гема с «правильной» версией, поскольку большинство Gemfile.lock были залочены на версию 0.8.7, которая являлась последней доступной версией и была установлена у всех.
В результате образовалось заблуждение, что прямой запуск исполняемых файлов совместим с Bundler и использует его для разрешения зависимостей. В случае проблем обычно рекомендовалось использовать гемсеты из RVM, поскольку гемсет, собранный из Gemfile.lock, по сути подразумевал, что все исполняемые файлы окружения работали с нужными версиями зависимостей.
Нет никаких оснований полагать, что набирая в консоле rake foo вы запускаете код песочнице Bundler, поскольку на самом деле он никак не задействован и нигде не запускается. Bundler должен активироваться в самом начале загрузки и иметь возможность подменить загрузчик подсунув ему нужные версии гемов прописанные в Gemfile.lock. Запуская исполняемые файлы напрямую вы исполняете руби-код до того, как Bundler мог бы вмешаться в процесс подключения зависимостей. В итоге подключается совсем не тот код, на который вы расчитываете. Как только это произошло, все становится весьма непредсказуемым.
Директория bin создает «переносимые» обертки для запускаемых файлов, поэтому ее смело можно добавлять в репозиторий.
Команда rails
Содержимое файла boot.rb в свою очередь весьма нетривиально:
Понимание файла Gemfile.lock
Например, давайте возьмем следующий файл:
Что значит ‘ПУТЬ‘, ‘ДРАГОЦЕННЫЙ КАМЕНЬ‘, ‘ПЛАТФОРМЫ‘ и ‘ЗАВИСИМОСТИ‘ описать? Все ли они необходимы?
Что означает восклицательный знак после имени драгоценного камня в группе ‘DEPENDECIES‘?
Вы можете найти больше об этом на веб-сайт комплектовщика (выделение добавлено ниже для вашего удобства):
Это важно: Gemfile.lock делает ваше приложение единым пакетом как вашего собственного кода, так и стороннего кода, который был запущен в последний раз, когда вы знаете точно, что все работало. Указание точных версий стороннего кода, от которого вы зависите, в вашем Gemfile не даст такую же гарантию, потому что гемы обычно объявляют диапазон версий для своих зависимостей.
Вы найдете следующие заголовки в файле блокировки, сгенерированном Bundler 1.x:
ДРАГОЦЕННЫЙ КАМЕНЬ (необязательно, но очень часто)
Это зависимости, полученные из сервера Rubygems. Это может быть основной индекс Rubygems на Rubygems.org или пользовательский индекс, например, доступный в Gemfury и других. В этом разделе вы увидите:
GIT (необязательно)
Это зависимости, полученные из данного git remote. Вы увидите разные разделы для каждого удаленного git, и внутри каждого раздела вы увидите:
ПУТЬ (необязательно)
ПЛАТФОРМЫ
Платформа Ruby, для которой был создан Gemfile.lock. Если какие-либо зависимости в Gemfile указывают платформу, они будут включены в Gemfile.lock только тогда, когда на этой платформе генерируется файл блокировки (например, посредством установки).
ЗАВИСИМОСТИ
Ruby VERSION (необязательно)
ОБЪЕДИНЕНО С (Bundler> = v1.10.x)
Версия Bundler, использованная для создания Gemfile.lock. Используется для напоминания установщикам обновить свою версию Bundler, если она старше, чем версия, создавшая файл.
ИСТОЧНИК ПЛАГИНА (необязательно и очень редко)
В плагине Rails вы увидите раздел PATH, но не в приложении Rails. Поскольку в приложении нет файла gemspec, нечего было бы вставлять в PATH.
Что касается ЗАВИСИМОСТИ, gembundler.com гласит:
Это означает, что разница между
Это всего лишь мои наблюдения, и я не могу полностью объяснить, почему так происходит, но я приветствую дальнейшие комментарии.
Gemfile и Gemfile.lock являются основными продуктами, предоставляемыми Bundler gem (сам Bundler является самоцветом).
Gemfile содержит зависимость вашего проекта от драгоценных камней, которые вы упоминаете вручную с указанием версии (версий), но эти экземпляры этих драгоценных камней зависят от других драгоценных камней, которые автоматически разрешаются компоновщиком.
Gemfile.lock содержит полный снимок всех драгоценных камней в Gemfile и связанных с ними зависимостей.
То же самое происходит, когда вы делитесь своим кодом на разных машинах
Вы делитесь своим Gemfile.lock вместе с Gemfile, когда вы запускаете bundle install на другом компьютере, он ссылается на ваш Gemfile.lock и пропускает шаг разрешения зависимостей, вместо этого он установит все те же самые зависимые гемы, которые вы использовали на исходная машина, которая поддерживает согласованность на нескольких машинах
Почему нам нужно поддерживать согласованность на нескольких машинах?
Запуск разных версий на разных машинах может привести к повреждению кода
Understanding the Gemfile.lock file
After running the bundle install command, ‘Gemfile.lock‘ is created in the working directory. What do the directives inside that file mean?
For example, let’s take the following file:
What do ‘PATH‘, ‘GEM‘, ‘PLATFORMS‘ and ‘DEPENDENCIES‘ describe? Are all of them required?
What should contain the ‘remote‘ and ‘specs‘ subdirectives?
What does the exclamation mark after the gem name in the ‘DEPENDENCIES‘ group mean?
7 Answers 7
You can find more about it in the bundler website (emphasis added below for your convenience):
After developing your application for a while, check in the application together with the Gemfile and Gemfile.lock snapshot. Now, your repository has a record of the exact versions of all of the gems that you used the last time you know for sure that the application worked.
This is important: the Gemfile.lock makes your application a single package of both your own code and the third-party code it ran the last time you know for sure that everything worked. Specifying exact versions of the third-party code you depend on in your Gemfile would not provide the same guarantee, because gems usually declare a range of versions for their dependencies.
You’ll find the following headings in a lockfile generated by Bundler 1.x:
GEM (optional but very common)
These are dependencies sourced from a Rubygems server. That may be the main Rubygems index, at Rubygems.org, or it may be a custom index, such as those available from Gemfury and others. Within this section you’ll see:
GIT (optional)
These are dependencies sourced from a given git remote. You’ll see a different one of these sections for each git remote, and within each section you’ll see:
PATH (optional)
PLATFORMS
The Ruby platform the Gemfile.lock was generated against. If any dependencies in the Gemfile specify a platform then they will only be included in the Gemfile.lock when the lockfile is generated on that platform (e.g., through an install).
DEPENDENCIES
RUBY VERSION (optional)
BUNDLED WITH (Bundler >= v1.10.x)
The version of Bundler used to create the Gemfile.lock. Used to remind installers to update their version of Bundler, if it is older than the version that created the file.
PLUGIN SOURCE (optional and very rare)





