2012-09-08 18 views
6

मैंने गिटब से एक रेपो क्लोन किया है, अब मैं इसके साथ प्रयोग करना चाहता हूं, क्योंकि मैं कोड के चारों ओर पोक करना चाहता हूं और इसके साथ गड़बड़ करना चाहता हूं। मैंने एक फ़ाइल test.rb बनाया है जो इस मणि को लोड करना चाहिए, लेकिन मैं अपना स्थानीय रूप से चेक आउट संस्करण लोड करना चाहता हूं, ऐसा करने का सही तरीका क्या है?मैं स्रोत से एक मणि कैसे लोड करूं?

अभी मैं केवल "require_relative 'the_gem_name/lib/file'" का एक गुच्छा उपयोग कर रहा हूं, जो गलत लगता है।

+0

यदि आपने मणि निर्देशिका में 'test.rb' बनाया है तो बस' आवश्यकता 'gemname'' का उपयोग करें। –

+0

क्या आपके पास एक रत्न है? – apneadiving

+0

यदि संभव हो तो मैं मणि निर्देशिका के बाहर test.rb बनाना चाहता हूं। और नहीं, मेरे पास एक रत्न नहीं है। – foobar

उत्तर

8

जब आप require 'foo' रूबी फ़ाइल foo.rb फ़ाइल के लिए लोड पथ में सभी निर्देशिकाओं की जांच करता है और उसे पहले लोड करता है। यदि foo.rb नाम की कोई फ़ाइल नहीं मिली है, और रूबीगैम्स का उपयोग करके LoadError उठाया गया है।

आप हैं RubyGems (जो की संभावना दिया जाता है कि यह रूबी में शामिल है 1.9+) का उपयोग करते हैं, तो बजाय तुरंत ऊपर उठाने एक LoadError सभी स्थापित रत्न देखने के लिए अगर एक एक फ़ाइल foo.rb शामिल की खोज कर रहे हैं। यदि ऐसा मणि पाया जाता है, तो इसे लोड पथ में जोड़ा जाता है और फ़ाइल लोड होती है।

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

लोड पथ में निर्देशिका जोड़ने के दो तरीके हैं। सबसे पहले आप वास्तविक कोड में यह कर सकते हैं, $LOAD_PATH (या $:) वैश्विक चर का उपयोग कर:

$LOAD_PATH.unshift '/path/to/the/gems/lib/' 
require 'the_gem' 

ध्यान दें कि आप सामान्य रूप से मणि, नहीं मणि के शीर्ष स्तर निर्देशिका के lib dir (जोड़ना चाहते हैं असल में यह वास्तविक मणि के आधार पर भिन्न हो सकता है, और एक से अधिक डीआईआर जोड़ने की आवश्यकता है, लेकिन lib मानक है)।

अन्य तरीके से ruby निष्पादन करने के लिए -I कमांड लाइन स्विच का उपयोग करने के लिए है:

$ ruby -I/path/to/the/gems/lib/ test.rb 

इस तरह एक सा क्लीनर हो सकता है, आम तौर पर के रूप में आप से लोड पथ के साथ खिलवाड़ किया जा नहीं करना चाहते हैं आपके कोड के अंदर, लेकिन यदि आप लाइब्रेरी का परीक्षण कर रहे हैं तो शायद इससे कोई फर्क नहीं पड़ता।

+0

ध्यान दें कि आप यह सुनिश्चित करने के लिए gemspec देख सकते हैं कि lib केवल एकमात्र निर्दिष्ट है [पथ की आवश्यकता है] (http://guides.rubygems.org/specification-reference/#require_paths)। इस प्रकार मणि रूबीगेम्स को बताता है कि फ़ाइल की आवश्यकता होने पर कहां देखना है। –

+0

+1 यह एक अच्छा समाधान है जब एक मणि बनाते हैं और इसे किसी अन्य प्रोजेक्ट से टेंडेम में लेते हैं, जैसे मैं हूं। – ashes999

+0

'-I' सबसे अच्छा हिस्सा था। मैंने अपने परिवर्तनों की त्वरित जांच करने के लिए 'pry' के साथ' --gem' का उपयोग किया! – Pysis

2

टिप्पणी में apneadiving के सुझाव के बाद, मैं एक Gemfile बनाया है और इस लाइन

source "http://rubygems.org" 

gem 'gem_name', path: '~/path/to/gem/source/folder' 

फिर bundle install, और bundle exec ruby test.rb जोड़ा गया है और यह काम किया।

संबंधित मुद्दे