ChatGPT解决这个技术问题 Extra ChatGPT

已安装的宝石列表?

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

我想解析 gem list 的输出。有不同的方法可以做到这一点吗?


B
Bhargav Rao

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

gem query --local

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

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


问题本身有更好的答案gem list
gem list 完全符合我的需要,并且在使用 CLI 时更容易回忆起来。为什么要做这么多命令来做一件事?
a)gem list、b)gem query 和 c)gem query --local 之间的区别。这三个似乎都有相同的行号。
t
the Tin Man

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 实例的数组,按版本号排序。

这使得可以执行以下操作:

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 规范的所有信息。


应该注意的是,“现在不推荐使用带有正则表达式的 Dependency.new”。
t
tripleee

两个都

gem query --local

 ruby -S gem list --local

列出 69 个条目

尽管

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

给我82

我使用 wc -l 来获取数字。不确定这是否是正确的检查方法。尝试将输出重定向到文本文件并进行比较,但这没有帮助 - 需要手动进行一一比较。


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

多年来一直有一种方法:

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

ruby -e 'puts Gem::Specification.all_names' 给了我“-e:1: uninitialized constant Gem (NameError)” 我该如何解决这个问题?
E
Evgenii
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

这给出了NoMethodError: undefined method 任何?当我使用 nil:NilClass` 时(在 rails console 中)。
И
Игорь Хлебников

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

Gem::Specification.all_names

你能改进你的答案吗?
改进或让我知道您在我的回答中到底不喜欢什么
这可以使用对现有答案增加了什么的解释。我为什么要使用这个代码?它有什么作用?它与 this answerthis answer 有何不同?
I
Iulian Onofrei

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

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

p
paul.belt

更现代的版本是使用类似于以下内容的东西......

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

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


K
Kurt Russell

在终端中尝试:

ruby -S gem list --local

请注意,OP 想要一个 Ruby 方法。
F
Fossmo

也许您可以从 gems 目录中获取文件(gems)?

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

N
Nicolai Robles

在您的调试器中输入 $LOAD_PATH 以获取您的 gem 列表。如果您没有调试器,请安装 pry:

gem install pry
pry
Pry(main)> $LOAD_PATH

这将输出一组已安装的 gem。