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