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ó 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:
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_gems
dự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 --local
dò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ể.
Đ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
gem list
.
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?
Cả hai
gem query --local
và
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.
ruby
liệ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
Có một phương pháp cho việc này từ lâu đời:
ruby -e 'puts Gem::Specification.all_names'
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
NoMethodError: undefined method
nào? ' cho nil: NilClass` khi tôi sử dụng nó (trong a rails console
).
sử dụng mã này (trong chế độ bảng điều khiển):
Gem::Specification.all_names
Đâ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
Hãy thử nó trong thiết bị đầu cuối:
ruby -S gem list --local
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.