在脚本中安装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