已安装的宝石列表?

Pra*_*man 130 ruby rubygems

有没有我可以调用的Ruby方法来获取已安装宝石的列表?

我想解析输出gem list.有没有不同的方法来做到这一点?

小智 320

这列出了我安装的所有宝石.

gem query --local
Run Code Online (Sandbox Code Playgroud)

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

请参见2.7列出所有已安装的gem

  • 当我看到赞成票时,这个答案就是人们想要的.:) (35认同)
  • OP想要一个Ruby*方法*来做,而不是命令行. (5认同)
  • 问题本身有一个更好的答案`gem list`。 (4认同)

the*_*Man 53

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
Run Code Online (Sandbox Code Playgroud)

这是获取列表的更新方式:

require 'rubygems'

def local_gems
   Gem::Specification.sort_by{ |g| [g.name.downcase, g.version] }.group_by{ |g| g.name }
end
Run Code Online (Sandbox Code Playgroud)

因为local_gems依赖于group_by它,它返回gems的哈希值,其中键是gem的名称,值是gem规范的数组.该值是安装的gem的实例数组,按版本号排序.

这使得可以做以下事情:

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]
Run Code Online (Sandbox Code Playgroud)

和:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 应该注意,"Dependency.new w/regexp现已弃用". (2认同)

Roo*_*bie 27

gem query --local
Run Code Online (Sandbox Code Playgroud)

 ruby -S gem list --local
Run Code Online (Sandbox Code Playgroud)

列出69个条目

ruby -e 'puts Gem::Specification.all_names'
Run Code Online (Sandbox Code Playgroud)

给了我82

wc -l以前得到的数字.不确定这是否是正确的检查方式.试图将输出重定向到文本文件并进行差异化,但这没有帮助 - 需要逐个手动比较.

  • 原因很简单。第一个命令只为每个 gem 添加 1 个条目,并在同一行的括号中列出版本。最后一个 `ruby` 命令在单独的行中列出每个 gem 版本。例如:`sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)` vs. `sass-3.3.14`, `sass-3.3.7`, `sass-3.3.6`, ` sass-3.2.19` (3认同)

小智 10

多年来一直有这种方法:

ruby -e 'puts Gem::Specification.all_names'
Run Code Online (Sandbox Code Playgroud)


Evg*_*nii 6

Gem::Specification.map {|a| a.name}
Run Code Online (Sandbox Code Playgroud)

但是,如果您的应用使用Bundler,它将仅返回依赖的本地gem的列表。要全部安装:

def all_installed_gems
   Gem::Specification.all = nil    
   all = Gem::Specification.map{|a| a.name}  
   Gem::Specification.reset
   all
end
Run Code Online (Sandbox Code Playgroud)


Иго*_*ков 6

使用此代码(在控制台模式下):

Gem::Specification.all_names
Run Code Online (Sandbox Code Playgroud)


Dar*_*cks 5

这是一个非常好的单行文字,用于打印所有宝石及其版本、主页和描述:

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
Run Code Online (Sandbox Code Playgroud)