После установки драгоценного камня в script, как мне загрузить драгоценный камень?
У меня есть небольшой Ruby script, который я пишу, чтобы автоматизировать подготовку среды разработки на локальных машинах. Поскольку я не могу быть уверенным, что библиотека rubyzip2
присутствует на всех машинах, у меня есть script установите ее, когда это необходимо.
В настоящее время мой script выполняет следующие действия:
begin
require 'zip/zip'
rescue LoadError
system("gem install rubyzip2")
end
Как только камень был установлен, script продолжает выполнение; однако, камень не был загружен, поэтому весь код, требующий rubyzip2
, останавливает выполнение.
Как загрузить драгоценный камень в память, чтобы script мог продолжить работу после установки?
Ответы
Ответ 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