Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> Ruby

रेल रत्नों को कैसे संभालती है?

कुछ हफ्ते पहले, मैंने लिखा था कि रूबीजम्स रूबी के लोड पथ को कैसे प्रबंधित करता है। लेकिन रेल सीधे रूबीगेम्स का उपयोग नहीं करती है - यह अपने रत्नों को प्रबंधित करने के लिए बंडलर का उपयोग करती है।

यदि आप नहीं जानते कि बंडलर कैसे काम करता है, तो जिस तरह से रत्न रेल में खींचे जाते हैं, वह थोड़ा भी लग सकता है जादुई। Gemfile में एक लाइन कैसे जोड़ते हैं? अपने ऐप में कोड प्राप्त करें? निर्भरता को आसान बनाने के लिए बंडलर, रेल और रूबीजेम्स एक साथ कैसे काम करते हैं?

क्यों बंडलर?

मैं बंडलर को एक सख्त मणि प्रबंधक के रूप में सोचता हूं। यानी, बंडलर आपको आवश्यक रत्नों के सही संस्करण स्थापित करने में मदद करता है, और आपके ऐप को केवल के लिए बाध्य करता है उन संस्करणों का उपयोग करें।

यह वास्तव में मददगार साबित होता है। यह समझने के लिए कि क्यों, आपको बंडलर से पहले दुनिया में वापस जाना होगा।

बंडलर से पहले, किसी प्रकार की सेटअप स्क्रिप्ट के साथ अपने रत्नों के सही संस्करणों को स्थापित करना अभी भी बहुत आसान था:

बिन/सेटअप
gem install rails -v 4.1.0
gem install rake -v 10.3.2
...

(अर्थात, जब तक रेल 4.1 की निर्भरताएं रेक 10.3.2 की निर्भरता के साथ संघर्ष नहीं करती हैं!)

लेकिन क्या होता है जब आप कुछ अलग-अलग रेल ऐप पर काम कर रहे होते हैं, जिनमें से प्रत्येक रत्न के विभिन्न संस्करणों पर निर्भर करता है? जब तक आप वास्तव में सावधान नहीं हैं, आप भयानक रत्न सक्रियण त्रुटि में भाग लेंगे:

gem_error
Gem::Exception: can't activate hpricot (= 0.6.161, runtime), 
already activated hpricot-0.8.3

उह। वह संदेश अभी भी मुझे बुरे सपने देता है। इसका आमतौर पर मतलब होता है कि आप एक दिन के लिए रत्नों को स्थापित और अनइंस्टॉल कर रहे हैं, इसलिए आप बस प्राप्त कर सकते हैं उस मशीन पर सही संस्करण। और इसके लिए केवल एक आकस्मिक gem install rake की आवश्यकता होती है अपनी सभी सावधानीपूर्वक योजना को पूरी तरह से गड़बड़ाने के लिए।

rvm रत्नों ने कुछ समय के लिए इस समस्या से निपटने में मदद की। लेकिन उन्हें स्थापित करने के लिए कुछ समय चाहिए, और यदि आप गलती से गलत रत्न में स्थापित हो गए हैं, तो आप उसी समस्या पर वापस आ जाएंगे। बंडलर के साथ, आपको अपनी निर्भरता के बारे में शायद ही कभी सोचना पड़े। आपके ऐप्स आमतौर पर बस काम करते हैं। और बंडलर रत्नों की तुलना में बहुत कम सेटअप लेता है।

तो, बंडलर आपके लिए दो महत्वपूर्ण कार्य करता है। यह आपके लिए आवश्यक सभी रत्नों को स्थापित करता है, और यह RubyGems को बंद कर देता है, इसलिए वे रत्न केवल केवल हैं जिनकी आपको उस रेल ऐप के अंदर आवश्यकता हो सकती है।

रेल बंडलर का उपयोग कैसे करती है?

इसके मूल में, बंडलर आपके रत्नों को स्थापित और अलग करता है। लेकिन यह सब कुछ नहीं करता है। आपके Gemfile . में रत्नों से कोड कैसा है इसे अपने रेल ऐप में बनाएं?

अगर आप bin/rails को देखें तो :

बिन/रेल
#!/usr/bin/env ruby
begin
  load File.expand_path("../spring", __FILE__)
rescue LoadError
end
APP_PATH = File.expand_path('../../config/application',  __FILE__)
require_relative '../config/boot'
require 'rails/commands'

आप देखेंगे कि यह ../config/boot . की आवश्यकता के द्वारा रेल लोड करता है . आइए उस फ़ाइल को देखें:

कॉन्फ़िगर/बूट
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)

require 'bundler/setup' # Set up gems listed in the Gemfile.

अरे, यह बंडलर है! (साथ ही, मैंने अभी सीखा है कि आप एक अलग Gemfile चुन सकते हैं पर्यावरण चर सेट करके उपयोग करने के लिए BUNDLE_GEMFILE . यह बहुत अच्छा है।)

bundler/setup कुछ चीजें करता है:

  • यह $LOAD_PATH . से रत्नों के सभी रास्तों को हटा देता है (जो रूबीजेम्स द्वारा किए गए किसी भी लोड पथ कार्य को उलट देता है)।
  • फिर, यह आपके Gemfile.lock में सिर्फ रत्नों के लोड पथ जोड़ता है $LOAD_PATH पर वापस जाएं ।

अब, केवल वही रत्न जिनकी आपको require हो सकती है से फ़ाइलें आपके Gemfile . में हैं ।

तो आपके लिए आवश्यक सभी रत्न आपके लोड पथ पर हैं। लेकिन जब आप स्वयं RubyGems का उपयोग करते हैं, तब भी आपको require आपको जिन फ़ाइलों की आवश्यकता है। जब आप बंडलर के साथ रेल का उपयोग करते हैं तो आपको अपने रत्नों की आवश्यकता क्यों नहीं है?

config/application.rb पर एक नज़र डालें , जो रेल बूट के बाद चलता है:

config/application.rb
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

यह फिर से बंडलर है! Bundler.require आपके द्वारा पास किए जाने वाले सभी समूहों में सभी रत्नों की आवश्यकता होती है। ("समूहों" से मेरा तात्पर्य उन समूहों से है जिन्हें आप अपने जेमफाइल में निर्दिष्ट करते हैं।)

Rails.groups में कौन से समूह हैं? , हालांकि?

railties/lib/rails.rb
   # Returns all rails groups for loading based on:
    #
    # * The Rails environment;
    # * The environment variable RAILS_GROUPS;
    # * The optional envs given as argument and the hash with group dependencies;
    #
    #   groups assets: [:development, :test]
    #
    #   # Returns
    #   # => [:default, :development, :assets] for Rails.env == "development"
    #   # => [:default, :production]           for Rails.env == "production"
    def groups(*groups)
      hash = groups.extract_options!
      env = Rails.env
      groups.unshift(:default, env)
      groups.concat ENV["RAILS_GROUPS"].to_s.split(",")
      groups.concat hash.map { |k, v| k if v.map(&:to_s).include?(env) }
      groups.compact!
      groups.uniq!
      groups
    end

खैर, यह समझाता है। Rails.groups होने जा रहा है [:default, :development] जब आप रेल को विकास मोड में चला रहे हों, [:default, :production] उत्पादन मोड में, और इसी तरह।

तो, बंडलर आपके Gemfile . में दिखेगा उन समूहों में से प्रत्येक से संबंधित रत्नों के लिए, और कॉल करें require प्रत्येक रत्न पर यह पाता है। यदि आपके पास एक रत्न है nokogiri , यह कॉल करेगा require "nokogiri" आपके लिए। और इसीलिए आपके रत्न आमतौर पर रेल में काम करते हैं, आपकी ओर से कोई अतिरिक्त कोड नहीं।

अपने टूल के बारे में जानें

यदि आप उन उपकरणों को अच्छी तरह से समझते हैं जिनका आप उपयोग करते हैं, तो उनके साथ काम करना आसान हो जाएगा। इसलिए यदि आप स्वयं को हर समय किसी न किसी चीज़ का उपयोग करते हुए पाते हैं, तो इसमें कुछ और मिनट लगाने के लायक है।

यदि आप रूबी और रेल में काम कर रहे हैं, तो आप हर दिन रत्नों का उपयोग करेंगे। उन्हें अच्छी तरह सीखने के लिए समय निकालें!


  1. एंड्रॉइड ओरिएंटेशन चेंज को कैसे हैंडल करें?

    यह उदाहरण दर्शाता है कि एंड्रॉइड ओरिएंटेशन चेंज को कैसे हैंडल करें चरण 1 - एंड्रॉइड स्टूडियो में एक नया प्रोजेक्ट बनाएं, फाइल ⇒ न्यू प्रोजेक्ट पर जाएं और एक नया प्रोजेक्ट बनाने के लिए सभी आवश्यक विवरण भरें। चरण 2 - निम्न कोड को res/layout/activity_main.xml में जोड़ें। उपरोक्त कोड में, हमने अभिव

  1. रेल में फ्लैश संदेशों का उपयोग कैसे करें

    फ्लैश संदेश क्या होते हैं? एक फ्लैश संदेश आपके रेल एप्लिकेशन के उपयोगकर्ताओं के साथ सूचनाओं को संप्रेषित करने का एक तरीका है ताकि वे जान सकें कि उनके कार्यों के परिणामस्वरूप क्या होता है। उदाहरण संदेश : “पासवर्ड सही ढंग से बदला गया” (पुष्टिकरण) “उपयोगकर्ता नहीं मिला” (त्रुटि) आप इन फ्लैश संदेशो

  1. रेल एप्लिकेशन में OmniAuth-Twitter का उपयोग कैसे करें

    इस ट्यूटोरियल में, आप सीखेंगे कि आपके एप्लिकेशन के उपयोगकर्ताओं को अपने ट्विटर अकाउंट का उपयोग करके लॉग इन करने की अनुमति कैसे दी जाए। OAuth जैसे टूल से ऐसा करना आसान बना दिया गया है। आप OmniAuth-Twitter का उपयोग करेंगे, जिसमें OmniAuth के लिए Twitter रणनीति शामिल है। चलो गोता लगाएँ! आरंभ कर