我正在编写一个小的Ruby脚本,以便在本地计算机上自动编写开发环境。因为我不能确定所有机器上都存在rubyzip2
库,所以我需要在需要时安装脚本。
目前,我的脚本正在执行以下操作:
begin
require 'zip/zip'
rescue LoadError
system("gem install rubyzip2")
end
安装gem后,脚本继续执行;但是,gem尚未加载,因此需要rubyzip2
的所有代码都会暂停执行。
如何将gem加载到内存中以便脚本在安装后继续运行?
答案 0 :(得分:18)
您应该先检查gem可用性,然后在需要时安装它,而不是执行require 'thegem'
并抢救错误。之后,您可以要求它。
查看this post for the gem availability
编辑
安装后,如果您不想重新加载脚本,则需要清除gem路径。 您可以使用此方法实现此目的:
Gem.clear_paths
已经回答了问题here
所以你的代码应该是这样的(例如):
begin
gem "rubyzip2"
rescue LoadError
system("gem install rubyzip2")
Gem.clear_paths
end
require 'zip/zip'
答案 1 :(得分:7)
如果bundler版本高于1.10(更新刚刚运行gem install bundler
),您可以使用新的'内联'功能如here所述。
require 'bundler/inline'
gemfile(true) do
source 'https://rubygems.org'
gem 'catpix'
end
puts Catpix::VERSION
gemfile
方法的第一个参数是,是否应安装尚未安装在用户系统上的宝石。
答案 2 :(得分:1)
将Bundler与您的应用程序/库一起使用。这将允许用户运行bundle
并且所有宝石都将被提取并准备好供您使用。
答案 3 :(得分:1)
好的,你可能想要使用Bundler并设置一个Gemfile,然后让bundler进行捆绑安装,捆绑包将获取所有宝石并安装它们(如果尚未安装)然后你可以要求所有宝石宝石文件中的宝石。请阅读链接中的文档以获取更多信息。
但是你想要在你的问题中专门做的是使用retry关键字。调用救援后,此关键字将重试循环。
因此,如果您需要gem并且它失败并且调用Load Error Exception。 Begin Block将进行救援,系统调用将安装gem,然后它将重试并需要gem。只是谨慎,因为这可能会导致无限循环,除非你想设置一个条件,可能只重试一次。
begin
require 'zip/zip'
rescue LoadError
system("gem install rubyzip2")
retry
end