【问题标题】:How to check if a gem is installed?如何检查是否安装了gem?
【发布时间】:2014-03-05 23:33:23
【问题描述】:

我为 Sinatra 项目安装了 data_mapper。很好奇,为什么当我做gem install brew 时,我可以$ which brew 并获取其位置的路径而不能用于data_mapper?这适用于某些宝石,但不适用于其他宝石。

如何验证 gem 是否安装正确?检查版本是否能确保 gem 被正确下载?

【问题讨论】:

标签: ruby gem


【解决方案1】:

一般解决方案

要获取已安装 gem 的完整列表:

gem list

要测试特定的 gem,您可以使用带有正则表达式的 -i

gem list -i "^gem_name$"

(此技术归功于 cmets 中的 Timo。)

OP的特殊解决方案

如果找不到data_mapper,可能是gem名称和你想象的不一样。

另外,如果您只是通过which brew 来查找 brew,那么您并没有找到名为 brew 的 gem,而是找到了 brew 可执行文件的位置。请改用gem which brew

编辑:

如果您通过which data_mapper 查找data_mapper,您可能找不到它。 which 是一个用于查找 unix 可执行文件的 unix 程序,而 data_mapper 可能没有。

由于您的目标是验证 gem 是否安装了正确的版本,因此请使用 gem list。您可以使用 gem list data_mapper 限制特定的 gem。

要验证它是否已安装并且工作,您必须尝试require gem,然后在您的代码中使用它。

【讨论】:

  • gem list 显示我有 data_mapper。 gem which brew 是否找到可执行文件?它看起来像一个 .rb 文件
  • gem which somegemname 显示了(我认为)在您执行require 'somegemname' 时加载的文件的路径。一般来说,gem 不像您通过常规 unix which 发现的程序那样具有“可执行文件”。
【解决方案2】:

如果您想在脚本中使用检查,这会提供更好的输出(真或假)和适当的退出代码:

gem list -i <gem_name>

或者添加版本选项:

gem list -i <gem_name> -v version

【讨论】:

  • gem list 将匹配的正则表达式作为参数。因此,如果您说gem list -i zip 之类的话,可能有很多不同的宝石可以匹配(gem list -r zip | wc -l 在撰写本文时返回 197)。但是,如果您对 zip gem 特别感兴趣,您应该在 regexp zip 中说明,即gem list -i ^zip$。否则gem install spain_zip_codes &amp;&amp; gem list -i zip => true,这可能永远不是你想要的。
  • 测试确切的名称使用-e like gem list -ie zip
【解决方案3】:

如果您在项目中使用bundle,请使用以下命令检查项目中您的 gem 是否完全匹配。

bundle info ^data_mapper$

【讨论】:

    【解决方案4】:

    对于脚本使用,gem query 可能更好:

    gem query --silent --installed --exact rubygems --version 2.0.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-06
      • 2017-11-14
      • 1970-01-01
      • 2021-11-23
      • 2017-04-13
      • 2012-03-28
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多