已安装的gem列表?

有一个Ruby方法,我可以打电话来获得已安装的gem列表?

我想分析gem list的输出。 有没有不同的方式来做到这一点?

Gem命令现在已经包含在Ruby 1.9+中,并且是Ruby 1.9以前的标准补充。

 require 'rubygems' name = /^/i dep = Gem::Dependency.new(name, Gem::Requirement.default) specs = Gem.source_index.search(dep) puts specs[0..5].map{ |s| "#{s.name} #{s.version}" } # >> Platform 0.4.0 # >> abstract 1.0.0 # >> actionmailer 3.0.5 # >> actionpack 3.0.5 # >> activemodel 3.0.5 # >> activerecord 3.0.5 

以下是更新列表的方法:

 require 'rubygems' def local_gems Gem::Specification.sort_by{ |g| [g.name.downcase, g.version] }.group_by{ |g| g.name } end 

因为local_gems依赖于group_by ,所以它返回一个gems散列,key是gem的名字,这个值是一个gem规范的数组。 该值是安装的该gem实例的数组,按版本号sorting。

这可以做到这样的事情:

 my_local_gems = local_gems() my_local_gems['actionmailer'] # => [Gem::Specification.new do |s| # s.authors = ["David Heinemeier Hansson"] # s.date = Time.utc(2013, 12, 3) # s.dependencies = [Gem::Dependency.new("actionpack", # Gem::Requirement.new(["= 4.0.2"]), # :runtime), # Gem::Dependency.new("mail", # Gem::Requirement.new(["~> 2.5.4"]), # :runtime)] # s.description = "Email on Rails. Compose, deliver, receive, and test emails using the familiar controller/view pattern. First-class support for multipart email and attachments." # s.email = "david@loudthinking.com" # s.homepage = "http://www.rubyonrails.org" # s.licenses = ["MIT"] # s.name = "actionmailer" # s.require_paths = ["lib"] # s.required_ruby_version = Gem::Requirement.new([">= 1.9.3"]) # s.requirements = ["none"] # s.rubygems_version = "2.0.14" # s.specification_version = 4 # s.summary = "Email composition, delivery, and receiving framework (part of Rails)." # s.version = Gem::Version.new("4.0.2") # end] 

和:

 puts my_local_gems.map{ |name, specs| [ name, specs.map{ |spec| spec.version.to_s }.join(',') ].join(' ') } # >> actionmailer 4.0.2 ... # >> arel 4.0.1,5.0.0 ... # >> ZenTest 4.9.5 # >> zucker 13.1 

最后一个例子与gem query --local命令行类似,只有你可以访问特定gem规范的所有信息。

这列出了我已经安装的所有gem。

 gem query --local 

http://guides.rubygems.org/command-reference/#gem-list

请参阅2.7列出所有安装的gem

 gem query --local 

  ruby -S gem list --local 

列出69个条目

 ruby -e 'puts Gem::Specification.all_names' 

给我82

我用wc -l来获取数字。 不知道这是否是正确的方法来检查。 试图将输出redirect到文本文件,并diff'ed,但没有帮助 – 将需要手动逐一比较。

有一个这样的年龄方法:

 ruby -e 'puts Gem::Specification.all_names' 
 Gem::Specification.map {|a| a.name} 

但是,如果您的应用程序使用Bundler,它将只返回相关本地gem列表。 要获得所有安装:

 def all_installed_gems Gem::Specification.all = nil all = Gem::Specification.map{|a| a.name} Gem::Specification.reset all end 

更现代的版本将是使用类似于以下的东西…

 require 'rubygems' puts Gem::Specification.all().map{|g| [g.name, g.version.to_s].join('-') } 

注意:Evgeny的答案的第一部分非常相似…但由于页面格式化,很容易错过。

也许你可以从gem目录中获取文件(gem)?

 gemsdir = "gems directory" gems = Dir.new(gemsdir).entries 

在terminal上试试

 ruby -S gem list --local 

从你的debugging器中input$LOAD_PATH来获得你的gem列表。 如果您没有debugging器,请安装pry:

 gem install pry pry Pry(main)> $LOAD_PATH 

这将输出一个你安装的gem数组。

这里有一个非常好的一行,可以打印所有的gem,版本,主页和说明:

Gem::Specification.sort{|a,b| a.name <=> b.name}.map {|a| puts "#{a.name} (#{a.version})"; puts "-" * 50; puts a.homepage; puts a.description; puts "\n\n"};nil