स्थापित रत्नों की सूची?


142

क्या कोई रूबी विधि है जिसे मैं स्थापित रत्नों की सूची प्राप्त करने के लिए कह सकता हूं?

मैं के उत्पादन को पार्स करना चाहता हूं gem list। क्या ऐसा करने का कोई अलग तरीका है?

जवाबों:


55

जेम कमांड को अब रूबी 1.9+ के साथ शामिल किया गया है, और रूबी प्री-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, यह रत्नों का एक हैश देता है, जहां कुंजी रत्न का नाम है, और मूल्य रत्न विशिष्टताओं की एक सरणी है। मान उस मणि के उदाहरणों का एक सरणी है जिसे संस्करण संख्या द्वारा क्रमबद्ध किया गया है।

इससे ऐसा करना संभव हो जाता है जैसे:

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कमांड-लाइन के समान है , केवल आपके पास किसी विशेष रत्न के विनिर्देश के लिए सभी जानकारी तक पहुंच है।


2
ध्यान दिया जाना चाहिए, "अब निर्भरता .new w / a regexp को हटा दिया गया है"।
मार्टिन पोल्जाक

351

यह मेरे द्वारा स्थापित सभी रत्नों को सूचीबद्ध करता है।

gem query --local

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

2.7 सभी स्थापित रत्नों को सूचीबद्ध करना देखें


37
जब मैं उत्थान को देखता हूं, तो यह उत्तर वही है जो अधिकांश लोग चाहते थे। :)
कैसर

4
प्रश्न में ही बेहतर उत्तर है gem list
blueray

gem listबिल्कुल वही किया जो मुझे चाहिए था, और यह बहुत सरल और याद करने में आसान है जब सीएलआई पर। एक काम करने के लिए इतनी आज्ञा क्यों?
डेव एवरिट

28

दोनों

gem query --local

तथा

 ruby -S gem list --local

सूची 69 प्रविष्टियों

जबकि

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

मुझे 82 देता है

मुझे wc -lनंबर मिलते थे। निश्चित नहीं है कि जाँचने का सही तरीका है या नहीं। पाठ फ़ाइलों के लिए आउटपुट को पुनर्निर्देशित करने की कोशिश की और diff'ed लेकिन वह मदद नहीं की - मैन्युअल रूप से एक-एक करके तुलना करने की आवश्यकता होगी।


1
वजह साफ है। पहला आदेश केवल प्रति मणि में 1 प्रविष्टि जोड़ता है और उसी पंक्ति में कोष्ठक में संस्करणों को सूचीबद्ध करता है। अंतिम rubyकमांड प्रत्येक रत्न संस्करण को एक अलग लाइन पर सूचीबद्ध करता है। के लिए उदाहरण के लिए: sass (3.3.14, 3.3.7, 3.3.6, 3.2.19)बनाम sass-3.3.14, sass-3.3.7, sass-3.3.6, sass-3.2.19
कैसर

10

सदियों से इसके लिए एक तरीका है:

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

माणिक- 'रत्न डालता है :: Specification.all_names' मुझे देता है "-e: 1: अनइंस्टाल्यूटेड स्थिर जेम (NameError)" मैं इसे कैसे हल करूं?
Metahuman

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

हालांकि, यदि आपका ऐप बुंडलर का उपयोग करता है, तो यह केवल निर्भर स्थानीय रत्नों की सूची लौटाएगा । सभी स्थापित करने के लिए:

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

यह NoMethodError: undefined method कोई देता है ? ' शून्य के लिए: NilClass` जब मैं इसे (ए rails console) का उपयोग करता हूं ।
iconoclast

4

इस कोड का उपयोग करें (कंसोल मोड में):

Gem::Specification.all_names

क्या आप अपना उत्तर सुधार सकते हैं?
मज़ारगोज़ा

सुधार किया है या मुझे पता है कि आप वास्तव में मेरे जवाब में क्या पसंद नहीं करते हैं
Игорь нилебников

3

एक और अधिक आधुनिक संस्करण कुछ का उपयोग करने के लिए निम्नलिखित होगा ...

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

ध्यान दें: बहुत ही एवगेनी द्वारा एक जवाब के पहले भाग के समान है ... लेकिन पृष्ठ स्वरूपण के कारण, यह याद करना आसान है।


3

यहाँ अपने संस्करण, मुखपृष्ठ और विवरण के साथ सभी रत्नों को प्रिंट करने के लिए एक बहुत अच्छा वन-लाइनर है:

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


1

हो सकता है कि आप रत्नों की निर्देशिका से फाइलें (रत्न) प्राप्त कर सकें?

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

1

अपने डीबगर प्रकार $LOAD_PATHसे अपने रत्नों की सूची प्राप्त करने के लिए। यदि आपके पास डिबगर नहीं है, तो pry स्थापित करें:

gem install pry
pry
Pry(main)> $LOAD_PATH

यह आपके स्थापित रत्नों की एक सरणी का उत्पादन करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.