在脚本中安装gem后,如何加载gem?

时间:2012-02-21 20:36:38

标签: ruby gem

我正在编写一个小的Ruby脚本,以便在本地计算机上自动编写开发环境。因为我不能确定所有机器上都存在rubyzip2库,所以我需要在需要时安装脚本。

目前,我的脚本正在执行以下操作:

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

安装gem后,脚本继续执行;但是,gem尚未加载,因此需要rubyzip2的所有代码都会暂停执行。

如何将gem加载到内存中以便脚本在安装后继续运行?

4 个答案:

答案 0 :(得分:18)

您应该先检查gem可用性,然后在需要时安装它,而不是执行require 'thegem'并抢救错误。之后,您可以要求它。

查看this post for the gem availability

this post

编辑

安装后,如果您不想重新加载脚本,则需要清除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