Ruby जेम क्या है?
एक जेम एक पैकेज है जिसे आप डाउनलोड और इंस्टॉल कर सकते हैं। जब आप इंस्टॉल किए गए जेम को require करते हैं तो आप अपने Ruby प्रोग्राम में अतिरिक्त कार्यक्षमता जोड़ रहे होते हैं।
जेम्स आपको अनुमति देते हैं:
- अपने Rails ऐप में लॉगिन सुविधा जोड़ें
- बाहरी सेवाओं (जैसे APIs) के साथ आसानी से काम करें
- एक वेब एप्लिकेशन बनाएं
यह सिर्फ कुछ उदाहरण हैं। हर जेम का अपना लक्ष्य होता है।
हम जेम्स का उपयोग क्यों करते हैं?
- यह Ruby में लाइब्रेरीज और टूल्स को साझा करने का तरीका है
- जेम की फाइल संरचना और फॉर्मेट इसे समझना आसान बनाता है कि वे कैसे काम करते हैं
- हर जेम के साथ आने वाली एक स्पेसिफिकेशन (".spec") फाइल डिपेंडेंसीज (अन्य आवश्यक जेम्स) का वर्णन करती है ताकि कोड के पास काम करने के लिए वह सब कुछ हो जो इसे चाहिए
RubyGems की बदौलत, हमारे पास सहायक लाइब्रेरीज का एक समृद्ध इकोसिस्टम है जो सिर्फ एक gem install दूर है!
एक दिए गए (नॉन-जेम) प्रोजेक्ट के लिए आवश्यक जेम्स की सूची को "Gemfile" नामक एक विशेष फाइल पर सूचीबद्ध किया जा सकता है ताकि उन्हें Bundler द्वारा स्वचालित रूप से इंस्टॉल किया जा सके। दोनों को बाद में इस गाइड में कवर किया गया है।
जेम्स के कुछ उदाहरण क्या हैं?
- Rails, और इसके सभी घटक (ActiveRecord, ActiveSupport, आदि) Ruby जेम्स के रूप में वितरित किए जाते हैं
- Pry, irb का शक्तिशाली विकल्प
- Nokogiri, एक लोकप्रिय XML और HTML पार्सर
अधिकांश जेम्स शुद्ध Ruby कोड हैं।
कुछ जेम्स में बेहतर प्रदर्शन के लिए Ruby C एक्सटेंशन शामिल होता है।
यह एक्सटेंशन आपके लिए जेम इंस्टॉल करते समय स्वचालित रूप से बनाया जाता है। कुछ मामलों में, आपको मैन्युअली अतिरिक्त सॉफ्टवेयर इंस्टॉल करना पड़ सकता है जो RubyGems द्वारा प्रबंधित नहीं है।
अब:
आइए अपने खुद का निर्माण करके और उन फाइलों को देखकर जेम्स के बारे में और जानें जो एक जेम बनाती हैं।
RubyGem कैसे बनाएं
आप bundle gem <name> चलाकर एक नए जेम के लिए फाइलें तैयार कर सकते हैं।
उदाहरण के लिए:
bundle gem awesome_gem
एक जेम निम्नलिखित संरचना से बना होता है:
├── awesome_gem.gemspec ├── bin │ ├── console │ └── setup ├── Gemfile ├── lib │ ├── awesome_gem │ │ └── version.rb │ └── awesome_gem.rb ├── Rakefile ├── README.md └── test ├── awesome_gem_test.rb └── test_helper.rb
यह .gemspec फाइल वह जगह है जहां आप जेम के बारे में सभी जानकारी पाएंगे।
इसमें शामिल है:
- जेम नाम
- जेम सारांश (संक्षिप्त विवरण)
- लेखक का नाम
- निर्भरता सूची
- जेम में शामिल करने के लिए फाइलों की सूची
- वैकल्पिक: लेखक का ईमेल पता, प्रोजेक्ट URL (होमपेज), एक्जीक्यूटेबल्स, C एक्सटेंशन्स, लंबा विवरण।
जेम संस्करण स्वयं lib/<gem_name>/version.rb में एक कॉन्स्टेंट के रूप में परिभाषित है।
यहां एक उदाहरण gemspec है:
Gem::Specification.new do |spec| spec.name = "awesome_gem" spec.version = AwesomeGem::VERSION spec.authors = ["Jesus Castello"] spec.summary = "Ruby जेम्स के बारे में लेख के लिए उदाहरण जेम" spec.files = Dir['**/**'].grep_v(/.gem$/) spec.require_paths = ["lib"] spec.add_development_dependency "bundler", "~> 1.16" spec.add_development_dependency "rake", "~> 10.0" spec.add_development_dependency "minitest", "~> 5.0" end
require_paths सरणी वह जगह है जहां Ruby आपके जेम फाइलों को खोजेगा जब आप उन्हें require करेंगे। यह आपको अपने कोड को lib/<gem_name>/ के तहत रखने और फिर इसे require "<gem_name>/<file_name>" के साथ require करने की अनुमति देता है।
उदाहरण के लिए:
lib/awesome_gem/parser.rb नामक एक फाइल को जेम के अंदर कहीं से भी require "awesome_gem/parser" के रूप में require किया जाएगा।
आपके अधिकांश requires lib/<gem_name>.rb में होंगे (/lib की रूट पर एकमात्र फाइल)।
यह वह फाइल है जो जेम को require करने पर लोड होती है!
अगला:
add_development_dependency लाइनें उन जेम्स को परिभाषित करती हैं जिनका आप विकास के दौरान उपयोग करने जा रहे हैं।
ये minitest, RSpec, या pry जैसे जेम्स हैं।
जबकि add_dependency उन जेम्स को परिभाषित करता है जिनका आप अपने कोड के हिस्से के रूप में उपयोग करते हैं।
एक बार जब आप डिफ़ॉल्ट मानों से सारांश और विवरण बदल देते हैं... तो आप bin/console प्रोग्राम का उपयोग करके अपने जेम के साथ एक irb सत्र लोड कर पाएंगे जो bundle gem आपके लिए बनाता है।
उदाहरण:
$ bin/console irb(main):001:0> irb(main):002:0> irb(main):003:0> AwesomeGem => AwesomeGem irb(main):004:0> irb(main):005:0> AwesomeGem::VERSION => "0.1.0"
फिर आप gem build <name>.gemspec का उपयोग करके जेम को पैकेज कर सकते हैं और gem push का उपयोग करके इसे rubygems.org पर प्रकाशित कर सकते हैं।
Bundler क्या है?
Ruby जेम्स के बारे में सीखते समय आप Bundler के बारे में भी पढ़ सकते हैं।
लेकिन Bundler वास्तव में क्या है?
Bundler निर्भरता प्रबंधन के लिए एक टूल है।
क्या RubyGems पहले से ही इसे संभालता नहीं था?
खैर, यह करता है... लेकिन केवल जेम्स के लिए स्वयं।
आपका नियमित Ruby एप्लिकेशन जेम के रूप में नहीं बनाया गया है, इसलिए इसे यह सुविधा नहीं मिलती।
यही कारण है कि Bundler मौजूद है!
Gemfiles को समझना
क्या आपने उन Gemfile फाइलों को देखा है?
यही वह जगह है जहां आप लिखते हैं कि आप अपने Ruby एप्लिकेशन के लिए किन जेम्स का उपयोग करना चाहते हैं।
ये जेम्स आपके लिए लोड हो जाएंगे बिना उन्हें require किए।
एक Gemfile ऐसा दिखता है:
ruby '2.5.0' gem 'rails', '~> 5.2.1' gem 'sqlite3' gem 'puma', '~> 3.11' gem 'bootsnap', '>= 1.1.0', require: false
Bundler (और RubyGems संस्करण 2.0 से) इस फाइल को पढ़ सकता है और इन जेम्स के अनुरोधित संस्करणों को इंस्टॉल कर सकता है।
जब आप bundle install कमांड चलाते हैं तो आपको यही देखना चाहिए:
Using turbolinks-source 5.1.0 Using turbolinks 5.1.1 Using uglifier 4.1.18 Using web-console 3.6.2 Bundle complete! 18 Gemfile dependencies, 78 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed.
अब:
आपके Gemfile में हर जेम के लिए संस्करण घोषित करते समय उपयोग किए जाने वाले ये सिम्बल्स (जैसे ~>) क्या हैं?
ये आपको संस्करणों की एक श्रृंखला का अनुरोध करने की अनुमति देते हैं।
आप ऐसी बातें कह सकते हैं, "मैं चाहता हूं कि संस्करण 1.2 के बराबर या उससे अधिक हो, लेकिन 2.0 से कम"।
जो ऐसा दिखेगा:
gem 'puma', '~> 1.2'
~> इस रेंज के लिए एक शॉर्टकट है:
gem 'puma', '>= 1.2', '< 2.0'
~> 5.2.1 के मामले में, इसका मतलब ठीक यही है:
'>= 5.2.1', '< 5.3'
संस्करण संख्या जितनी अधिक विशिष्ट होगी, संस्करण रेंज उतनी ही अधिक प्रतिबंधित होगी।
Gemfile विकल्प और Gemfile.lock
Gemfile के अंदर जेम require करते समय आपके पास कुछ विकल्प होते हैं।
उदाहरण के लिए:
आप किसी अलग स्रोत से जेम खींचना चाह सकते हैं, जैसे GitHub।
यह तब मददगार होता है जब आपको प्रोजेक्ट के नवीनतम संस्करण का उपयोग करने की आवश्यकता होती है, भले ही यह अभी तक rubygems.org पर जारी नहीं किया गया हो।
यहां एक उदाहरण है:
gem "rails", git: "git@github.com:rails/rails.git"
आप branch विकल्प पास करके उस कोड का उपयोग कर सकते हैं जो मास्टर नहीं है।
इस तरह:
gem "awesome_print", git: "git@github.com:awesome-print/awesome_print.git", branch: "v2"
एक और विकल्प जो आपको मिल सकता है वह है require: false।
यह क्या करता है?
यह Bundler को जेम को ऑटो-require नहीं करने के लिए कहता है। इसका मतलब है कि जब आपको इसकी आवश्यकता होगी तो आपको अपने कोड में इसे require करना होगा।
इसका उपयोग सीमित दायरे वाले जेम्स के लिए किया जाता है।
उदाहरण के लिए:
जेम्स जिनका आप किसी विशिष्ट रेक टास्क में उपयोग करते हैं, लेकिन आप अपने Rails कंट्रोलर्स और मॉडल्स में उपयोग नहीं करते। लाभ यह है कि आप अपने ऐप कोड में मेमोरी बचाते हैं क्योंकि आप उस जेम को केवल तभी लोड करते हैं जब आपको इसकी आवश्यकता होती है।
आप जेम्स को एनवायरनमेंट के अनुसार ग्रुप भी कर सकते हैं।
इसका मतलब है कि आप ऐसे जेम्स रख सकते हैं जो केवल विकास में इंस्टॉल और लोड हों (जैसे capybara और pry)।
अंत में, bundler एक Gemfile.lock बनाता है।
अंतर क्या है?
एक Gemfile.lock ऑटो-जेनरेटेड है और यह सटीक रूप से कहता है कि हर जेम के कौन से संस्करण इंस्टॉल किए गए थे।
Bundler इन संस्करणों को इंस्टॉल करेगा ताकि जब आप इस एप्लिकेशन को प्रोडक्शन में डेप्लॉय करें, या अपने प्रोजेक्ट को अन्य डेवलपर्स के साथ साझा करें, तो हर कोई जेम्स के समान सेट के साथ काम करेगा।
उपयोगी जेम और Bundler कमांड्स
| कमांड | विवरण |
|---|---|
| gem list | आपके सभी इंस्टॉल किए गए जेम्स सूचीबद्ध करता है। नाम से जेम्स फ़िल्टर करने के लिए एक आर्गुमेंट स्वीकार करता है (उदाहरण: gem list active) |
| gem which <name> | आपको वह पथ देता है जहां जेम इंस्टॉल है। |
| gem search <name> | कॉन्फिगर्ड स्रोतों से जेम्स खोजें (डिफ़ॉल्ट: rubygems.org)। एक रेगुलर एक्सप्रेशन लेता है (उदाहरण: gem search "\Aawesome_")। |
| gem env | आपके जेम एनवायरनमेंट के बारे में जानकारी प्रदर्शित करता है (संस्करण, पथ, कॉन्फिगरेशन)। |
| gem install <name> -v <version> | आपको एक विशिष्ट जेम संस्करण इंस्टॉल करने की अनुमति देता है (उदाहरण: gem install sinatra -v 2.0.0)। |
| bundle viz | आपके वर्तमान प्रोजेक्ट के लिए निर्भरता ग्राफ का विज़ुअलाइज़ेशन उत्पन्न करता है। |
| bundle show | Bundler के माध्यम से इंस्टॉल किए गए किसी विशेष जेम के बारे में जानकारी दिखाता है। Gemfile वाले फोल्डर के अंदर होना चाहिए। |
| bundle outdated | वर्तमान प्रोजेक्ट में पुराने जेम्स की सूची प्रदर्शित करता है। उन्हें ग्रुप करने के लिए --groups विकल्प का उपयोग कर सकते हैं। |
| bundle console | वर्तमान प्रोजेक्ट के Gemfile से जेम्स के साथ एक irb सत्र चलाता है। |
सारांश
आपने RubyGems, Ruby के लिए पैकेज सिस्टम के बारे में सीखा। आपने यह भी सीखा कि जेम कैसे संरचित होता है, Gemfile क्या है, Bundler और Gemfile और Gemfile.lock के बीच अंतर।
मुझे उम्मीद है कि आपको यह उपयोगी लगा!
कृपया इस लेख को साझा करें, यदि आपने अभी तक नहीं किया है तो न्यूज़लेटर की सदस्यता लें (9000+ Ruby डेवलपर्स!) और मेरी Ruby किताब देखें।
पढ़ने के लिए धन्यवाद और आपका दिन शुभ हो 🙂