【发布时间】:2014-03-05 23:33:23
【问题描述】:
我为 Sinatra 项目安装了 data_mapper。很好奇,为什么当我做gem install brew 时,我可以$ which brew 并获取其位置的路径而不能用于data_mapper?这适用于某些宝石,但不适用于其他宝石。
如何验证 gem 是否安装正确?检查版本是否能确保 gem 被正确下载?
【问题讨论】:
我为 Sinatra 项目安装了 data_mapper。很好奇,为什么当我做gem install brew 时,我可以$ which brew 并获取其位置的路径而不能用于data_mapper?这适用于某些宝石,但不适用于其他宝石。
如何验证 gem 是否安装正确?检查版本是否能确保 gem 被正确下载?
【问题讨论】:
一般解决方案
要获取已安装 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 发现的程序那样具有“可执行文件”。
如果您想在脚本中使用检查,这会提供更好的输出(真或假)和适当的退出代码:
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 && gem list -i zip => true,这可能永远不是你想要的。
-e like gem list -ie zip
如果您在项目中使用bundle,请使用以下命令检查项目中您的 gem 是否完全匹配。
bundle info ^data_mapper$
【讨论】:
对于脚本使用,gem query 可能更好:
gem query --silent --installed --exact rubygems --version 2.0.0
【讨论】: