有没有我可以调用的 Ruby 方法来获取已安装 gem 的列表?
我想解析gem list. 有不同的方法可以做到这一点吗?
gem list
Gem 命令现在包含在 Ruby 1.9+ 中,并且是 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
这是获取列表的更新方法:
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,它返回 gem 的哈希,其中键是 gem 的名称,值是 gem 规范的数组。该值是已安装的 gem 实例的数组,按版本号排序。
local_gems
group_by
这使得可以执行以下操作:
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 query --local