List of installed gems?

匿名 (未验证) 提交于 2019-12-03 01:29:01

问题:

Is there a Ruby method I can call to get the list of installed gems?

I want to parse the output of gem list. Is there a different way to do this?

回答1:

The Gem command is included with Ruby 1.9+ now, and is a standard addition to Ruby pre-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 

Here's an updated way to get a list:

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

Because local_gems relies on group_by, it returns a hash of the gems, where the key is the gem's name, and the value is an array of the gem specifications. The value is an array of the instances of that gem that is installed, sorted by the version number.

That makes it possible to do things like:

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] 

And:

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 

The last example is similar to the gem query --local command-line, only you have access to all the information for a particular gem's specification.



回答2:

This lists all the gems I have installed.

gem query --local 

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

See 2.7 Listing all installed gems



回答3:

Both

gem query --local 

and

 ruby -S gem list --local 

list 69 entries

While

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

gives me 82

I used wc -l to get the numbers. Not sure if that is the right way to check. Tried to redirect the output to text files and diff'ed but that didn't help - will need to compare manually one by one.



回答4:

There's been a method for this for ages:

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


回答5:

Gem::Specification.map {|a| a.name} 

However, if your app uses Bundler it will return only list of dependent local gems. To get all installed:

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


回答6:

A more modern version would be to use something akin to the following...

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

NOTE: very similar the first part of an answer by Evgeny... but due to page formatting, it's easy to miss.



回答7:

Maybe you can get the files (gems) from the gems directory?

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


回答8:

Try it in the terminal:

ruby -S gem list --local 


回答9:

From within your debugger type $LOAD_PATH to get a list of your gems. If you don't have a debugger, install pry:

gem install pry pry Pry(main)> $LOAD_PATH 

This will output an array of your installed gems.



回答10:

Here's a really nice one-liner to print all the Gems along with their version, homepage, and description:

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



回答11:

by one command:

Gem::Specification.all_names 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!