जेमफाइल में 'आवश्यक: असत्य' का क्या अर्थ है?


429

क्या ये:

gem 'whenever', require: false

इसका मतलब है कि मणि को स्थापित करने की आवश्यकता है, या इसका मतलब यह है कि इसकी आवश्यकता नहीं है?


1
अधिकांश उत्तर (स्वीकृत एक सहित) रेल के बारे में हैं Bundler.requireजो डिफ़ॉल्ट रूप से समझते हैं। केवल सिरो और नीशा के उत्तर सही हैं।
Nakilon

जवाबों:


472

इसका मतलब है कि मणि स्थापित करें, लेकिन बुंडलर शुरू करने के लिए कॉल की आवश्यकता नहीं है। इसलिए आपको मैन्युअल रूप से कॉल करना होगा

require "whenever"

यदि आप पुस्तकालय का उपयोग करना चाहते हैं।

अगर तुम करना था

gem "whenever", require: "whereever"

तब बंडलर जब भी नाम का रत्न डाउनलोड करेगा, लेकिन कॉल करेगा

require "whereever"

यह अक्सर उपयोग किया जाता है यदि आवश्यकता के लिए पुस्तकालय का नाम मणि के नाम से अलग है।


112
@VenkatD। कभी-कभी आप कुछ निश्चित रत्नों को स्थापित करना चाहते हैं, लेकिन आप उन्हें हर प्रक्रिया में लोड नहीं करना चाहते हैं। मेरे पास एक विशेष रेक कार्य है जिसे मैं समय-समय पर हेरोकू पर उनके शेड्यूलर ऐड-ऑन के माध्यम से आमंत्रित करना चाहता हूं। इस विशेष रेक कार्य के लिए कुछ विशिष्ट रत्नों की आवश्यकता होती है, जो कि शेष अनुप्रयोग की आवश्यकता नहीं होती है। तो मैं :require => falseइन विशेष रत्नों और स्पष्ट रूप require "thegem"से रेक कार्य से। यह तब मुख्य ऐप प्रोसेस और स्टार्टअप टाइम आदि में मेमोरी सेव करेगा। ऐप परफॉर्मेंस, हालांकि, प्रभावित नहीं होना चाहिए, भले ही आपको हर प्रक्रिया में इन अतिरिक्त रत्नों की आवश्यकता हो।
माइकल वान रूइजेन

5
@MichaelvanRooijen - महान बिंदु, हालांकि: "ऐप प्रदर्शन, हालांकि, प्रभावित नहीं होना चाहिए भले ही आपको हर प्रक्रिया में इन अतिरिक्त रत्नों की आवश्यकता हो"। मुझे नहीं लगता कि यह सच है। ऑब्जेक्ट्स को आवंटित
नाथन लॉन्ग

1
@MichaelvanRooijen - व्यवहार में, आप सही कह रहे हैं, यह आम तौर पर तब तक नहीं होगा जब तक आप लाइब्रेरी का उपयोग नहीं करते। लेकिन एक मणि की आवश्यकता कम से कम अपनी मुख्य फ़ाइल को परिवाद में लोड करने की होगी, और शायद यह स्वयं की अधिक आवश्यकता होती है। यहां तक ​​कि अगर तुम require 'yaml', तुम अब YAMLस्मृति में एक वस्तु के रूप में मॉड्यूल है।
नाथन लॉन्ग

2
क्या होगा यदि आप सेट करना चाहते हैं तो गलत और लाइब्रेरी का नाम रत्न के नाम के साथ भी अलग है?
पीटर-जन सेलिस

2
@ पीटर-जेनेलिस इस मामले में आप बस सेट कर देंगे :require => falseऔर फिर आपके कोड में एक होगाrequire 'library_name_here'
रोब डी मार्को

73

आप उपयोग :require => falseकरते हैं जब आप चाहते हैं कि मणि स्थापित किया जाए लेकिन "आवश्यक" नहीं।

इसलिए आपके द्वारा दिए गए उदाहरण में: gem 'whenever', :require => false जब कोई बंडल चलाता है तो जब भी मणि के साथ स्थापित किया जाएगा gem install whenever। जब भी एक रेक कार्य चलाकर क्रोन जॉब्स बनाने के लिए उपयोग किया जाता है, लेकिन आमतौर पर रेल्स (या अन्य ढांचे के भीतर से यदि रैलिंग नहीं होती है) का उपयोग नहीं किया जाता है।

इसलिए आप ऐसी :require => falseकिसी भी चीज के लिए उपयोग कर सकते हैं , जिसे आपको कमांड लाइन से चलाने की जरूरत है, लेकिन अपने कोड के भीतर की जरूरत नहीं है।


6
यह एक रत्न के लिए भी इस्तेमाल किया जा सकता है जिसे आप केवल अनुरोधों के एक छोटे सबसेट में उपयोग करते हैं।
नाथन लॉन्ग

61

require: falseBundler.requireउस विशिष्ट मणि की आवश्यकता न होने के बारे में बताता है : मणि की आवश्यकता स्पष्ट रूप से होनी चाहिए require 'gem'

यह विकल्प प्रभावित नहीं करता है:

  • bundle install: मणि परवाह किए बिना स्थापित हो जाएगा

  • requireबंडलर द्वारा खोज पथ सेटअप।

    जब आप दोनों में से कोई भी करते हैं, तो बुडलर उस रास्ते से चीजें जोड़ता है:

    • Bundle.setup
    • जिसे कहा जाता है require bundler/setup
    • जिसे कहा जाता है bundle exec

उदाहरण

Gemfile

source 'https://rubygems.org'
gem 'haml'
gem 'faker', require: false

main.rb

# Fail because we haven't done Bundler.require yet.
# bundle exec does not automatically require anything for us,
# it only puts them in the require path.
begin Haml; rescue NameError; else raise; end
begin Faker; rescue NameError; else raise; end

# The Bundler object is automatically required on `bundle exec`.
Bundler.require

Haml
# Not required because of the require: false on the Gemfile.
# THIS is what `require: false` does.
begin Faker; rescue NameError; else raise; end

# Faker is in the path because Bundle.setup is done automatically
# when we use `bundle exec`. This is not affected by `require: false`.
require 'faker'
Faker

फिर निम्नलिखित अपवाद नहीं उठाएंगे:

bundle install --path=.bundle
bundle exec ruby main.rb

आप के साथ खेलने के लिए GitHub पर

रेल का उपयोग

जैसा कि इनिशियलाइज़ेशन ट्यूटोरियल में बताया गया है , डिफॉल्ट रेल्स टेम्प्लेट स्टार्टअप पर चलता है:

  • config/boot.rb
  • config/application.rb

config/boot.rb शामिल हैं:

ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])

जो require 'bundler/setup'आवश्यकता पथ को निर्धारित करता है ।

config/application.rb कर देता है:

Bundler.require(:default, Rails.env)

जिसे वास्तव में रत्नों की आवश्यकता होती है।


ध्यान दें कि उपयोग require 'fakerकरने से सही मणि संस्करण का उपयोग नहीं किया जा सकता है, खासकर यदि आप एक जीआईटी रेफरी के लिए जेफाइल पॉइंट हैं।
dazonic

@dazonic हैम उदाहरण पर कोई अलग है?
सिरो सेंटिल्ली 郝海东 冠状 i i

9

जब भी आप अपने जेम में एक रत्न निर्दिष्ट करते हैं Gemfileऔर चलाते हैं bundle install, तो बंडलर उस मणि के लिए निर्दिष्ट मणि और लोड कोड स्थापित करेगा, require 'whenever'इस तरह से बंडलर आपके रेल एप्लिकेशन में आपके सभी रत्नों के लिए कोड लोड करेगा, और आप किसी भी तरीके से कॉल कर सकते हैं किसी भी दर्द के बिना किसी भी मणि की तरह, आप ज्यादातर समय करते हैं।

लेकिन रत्न whenever, faker or capistrano कुछ ऐसा है, जिसकी आपको अपने ऐप कोड में ज़रूरत नहीं है, जब भी आपको अपनी schedule.rb फ़ाइल में कोड की आवश्यकता होती है, deploy.rb तैनाती नुस्खा को अनुकूलित करने के लिए फ़ाइल में क्रोन और कैप्रिस्ट्रानो कोड को प्रबंधित करने के लिए, ताकि आपको अपने ऐप कोड में इन रत्नों के लिए कोड लोड करने की आवश्यकता न हो और आप जहाँ भी हों इन रत्नों से किसी भी विधि को कॉल करना चाहते हैं, जिसे आप मैन्युअल रूप से डालकर अपने आप से थोड़े रत्न की आवश्यकता कर सकते हैं require "whenever" । तो आप :require => falseइन रत्न के लिए अपने Gemfile में डालते हैं, इस तरह से बंडल उस मणि को स्थापित करेगा लेकिन उस मणि के लिए कोड लोड नहीं करेगा, आप इसे तब भी कर सकते हैं जब आप अपने मामले में 'जब भी' की आवश्यकता हो, जैसे चाहे डाल सकते हैं।


2

अपने Gemfile में रत्नों की आवश्यकता के लिए, आपको कॉल करना होगा Bundler.require

आप बंडल को मणि की आवश्यकता से रोक सकते हैं require: false, लेकिन यह अभी भी मणि को स्थापित और बनाए रखेगा। अधिक विस्तृत विवरण के लिए इसे देखें ।

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