После установки драгоценного камня в скрипте, как я могу загрузить драгоценный камень? - PullRequest
14 голосов
/ 22 февраля 2012

У меня есть небольшой скрипт на Ruby, который я пишу для автоматизации подготовки среды разработки на локальных машинах.Поскольку я не могу быть уверен, что библиотека rubyzip2 присутствует на всех компьютерах, у меня есть сценарий, который устанавливает ее при необходимости.

В настоящее время мой сценарий выполняет следующие действия:

begin
  require 'zip/zip'
rescue LoadError
  system("gem install rubyzip2")
end

Как только гем будет установлен, скрипт продолжит выполнение;однако гем не был загружен, поэтому весь код, требующий rubyzip2, останавливает выполнение.

Как загрузить гем в память, чтобы скрипт мог продолжить работу после установки?

Ответы [ 4 ]

18 голосов
/ 22 февраля 2012

Вместо того, чтобы делать require 'thegem' и исправлять ошибку, вы должны проверить доступность гема, а затем, при необходимости, установить его.После этого вы можете потребовать его.

Посмотрите на этот пост на наличие самоцвета

Или этот пост

РЕДАКТИРОВАТЬ

После установки вам необходимо очистить пути к драгоценным камням, если вы не хотите перезагружать свой скрипт.Вы можете достичь этого с помощью этого метода:

Gem.clear_paths

Здесь уже есть вопросы здесь

Таким образом, ваш код должен выглядеть следующим образом (например):

begin
  gem "rubyzip2"
rescue LoadError
  system("gem install rubyzip2")
  Gem.clear_paths
end

require 'zip/zip'
7 голосов
/ 02 июля 2015

При bundler версии выше 1.10 (для обновления просто запустите gem install bundler) вы можете использовать его новую функцию «inline», как описано здесь .

require 'bundler/inline'

gemfile(true) do
  source 'https://rubygems.org'
  gem 'catpix'
end

puts Catpix::VERSION

Первый параметр метода gemfile указывает, должны ли быть установлены гемы, которые еще не установлены в системе пользователя.

1 голос
/ 22 февраля 2012

Хорошо, так что вы можете использовать Bundler и настроить Gemfile, а затем попросить bundler выполнить установку комплекта, bundler извлечет все гемы и установит их, если он еще не установлен, и вы можете затемтребовать все драгоценные камни в файле драгоценного камня.Прочитайте документацию по ссылке для получения дополнительной информации.

Но что вы хотите сделать конкретно в своем вопросе, так это использовать ключевое слово retry.Это ключевое слово будет повторять цикл после вызова функции спасения.

Итак, если вам нужен гем, и он не работает, и вызывается исключение ошибки загрузки.Блок Begin будет спасен, системный вызов установит драгоценный камень, затем он попытается снова и потребует драгоценный камень.Просто осторожно, потому что это может привести к бесконечному циклу, если вы не захотите установить условие, которое может повторить попытку только один раз.

begin
  require 'zip/zip'
rescue LoadError
  system("gem install rubyzip2")
  retry
end
1 голос
/ 22 февраля 2012

Используйте Bundler с вашим приложением / библиотекой. Это позволит пользователям запускать bundle, и все драгоценные камни будут извлечены и готовы для использования.

...