Подтвердить что ты не робот

После установки драгоценного камня в script, как мне загрузить драгоценный камень?

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

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

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

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

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

4b9b3361

Ответ 1

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

require 'bundler/inline'

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

puts Catpix::VERSION

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

Ответ 2

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

Взгляните на этот пост для доступности gem

Или этот пост

EDIT

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

Gem.clear_paths

Уже есть ответы на вопросы здесь

Итак, ваш код должен выглядеть так (например):

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

require 'zip/zip'

Ответ 3

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

Ответ 4

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

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

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

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