Danh sách đá quý được cài đặt?


141

Có phương pháp Ruby nào tôi có thể gọi để lấy danh sách đá quý đã cài đặt không?

Tôi muốn phân tích đầu ra của gem list. Có một cách khác nhau để làm điều này?

Câu trả lời:


55

Lệnh Gem được bao gồm trong Ruby 1.9+ và là một bổ sung tiêu chuẩn cho 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

Đây là một cách cập nhật để có được một danh sách:

require 'rubygems'

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

Bởi vì local_gemsdựa vàogroup_by , nó trả về một hàm băm của đá quý, trong đó khóa là tên của đá quý và giá trị là một mảng các thông số kỹ thuật của đá quý. Giá trị là một mảng các thể hiện của viên ngọc đó được cài đặt, được sắp xếp theo số phiên bản.

Điều đó làm cho nó có thể làm những việc như:

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]

Và:

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

Ví dụ cuối cùng tương tự như gem query --localdòng lệnh, chỉ bạn mới có quyền truy cập vào tất cả thông tin cho thông số kỹ thuật của một loại đá quý cụ thể.


2
Cần lưu ý, "Dependency.new w / a regrec bị phản đối" ngay bây giờ.
Martin Poljak

351

Điều này liệt kê tất cả các đá quý tôi đã cài đặt.

gem query --local

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

Xem 2.7 Liệt kê tất cả các đá quý được cài đặt


37
Khi tôi nhìn vào các upvote, thì câu trả lời này là điều mà hầu hết mọi người muốn. :)
kaiser

4
có một câu trả lời tốt hơn trong câu hỏi riêng của mình gem list.
Blueray

gem listđã làm chính xác những gì tôi cần, và nó đơn giản và dễ nhớ hơn rất nhiều khi ở trên CLI. Tại sao rất nhiều lệnh để làm một việc?
Dave Everitt

28

Cả hai

gem query --local

 ruby -S gem list --local

liệt kê 69 mục

Trong khi

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

cho tôi 82

Tôi đã sử dụng wc -lđể có được những con số. Không chắc chắn nếu đó là cách đúng để kiểm tra. Đã thử chuyển hướng đầu ra thành các tệp văn bản và khác nhau nhưng điều đó không giúp ích - sẽ cần so sánh từng cái một cách thủ công.


1
Lý do rất đơn giản. Lệnh đầu tiên chỉ thêm 1 mục nhập cho mỗi viên ngọc và liệt kê các phiên bản trong ngoặc trên cùng một dòng. Lệnh cuối cùng rubyliệt kê mỗi phiên bản đá quý trên một dòng riêng biệt. Đối với ví dụ: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)so với sass-3.3.14, sass-3.3.7, sass-3.3.6, sass-3.2.19
kaiser

10

Có một phương pháp cho việc này từ lâu đời:

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

ruby -e 'đặt Gem :: Đặc điểm kỹ thuật
Metahuman

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

Tuy nhiên, nếu ứng dụng của bạn sử dụng Bundler, nó sẽ chỉ trả về danh sách đá quý cục bộ phụ thuộc . Để cài đặt tất cả:

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

Cái này cho cái NoMethodError: undefined method nào? ' cho nil: NilClass` khi tôi sử dụng nó (trong a rails console).
iconoclast

4

sử dụng mã này (trong chế độ bảng điều khiển):

Gem::Specification.all_names

bạn có thể cải thiện câu trả lời của bạn?
MZaragoza

cải thiện hoặc cho tôi biết chính xác những gì bạn không thích trong câu trả lời của tôi
Игорь Хлебников

3

Một phiên bản hiện đại hơn sẽ là sử dụng một cái gì đó tương tự như sau ...

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

LƯU Ý: rất giống phần đầu tiên của câu trả lời của Evgeny ... nhưng do định dạng trang, rất dễ bỏ lỡ.


3

Đây là một lớp lót thực sự đẹp để in tất cả các viên Đá quý cùng với phiên bản, trang chủ và mô tả của chúng:

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

2

Hãy thử nó trong thiết bị đầu cuối:

ruby -S gem list --local

1
Lưu ý rằng OP muốn một phương thức Ruby .
Tin Man

1

Có lẽ bạn có thể lấy các tập tin (đá quý) từ thư mục đá quý?

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

1

Từ trong trình gỡ lỗi của bạn $LOAD_PATHđể có được danh sách đá quý của bạn. Nếu bạn không có trình gỡ lỗi, hãy cài đặt pry:

gem install pry
pry
Pry(main)> $LOAD_PATH

Điều này sẽ xuất ra một mảng đá quý được cài đặt của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.