2009-06-25 11 views
11

कुछ रूबी librararies मैं उपयोग का उपयोग कर रहा require बयान इस तरह:"फ़ाइल.dirname (__ FILE__) की आवश्यकता है" - फाइल सिस्टम निर्भरता को सुरक्षित रूप से पूर्ववत कैसे करें?

require File.dirname(__FILE__) + '/specification_helper.rb' 

lib_dir = File.expand_path(File.join(File.dirname(__FILE__), "lib")) 

require File.join(File.dirname(__FILE__), 'lib/tools', 'version') 

require File.expand_path(File.join(File.dirname(__FILE__), 'datautils', 'conn')) 

इस प्रारूप अपने कोड बेकार में फ़ाइल प्रणाली की संरचना पर निर्भर नहीं हो जाता?

लेखक इस तरह से ऐसा क्यों करते थे?

फाइल सिस्टम पर इस निर्भरता को हटाने के लिए इस कोड को (सुरक्षित रूप से) करना संभव होगा?

+0

यह भी देखें codemeta.source_pdir http://en.wikibooks.org/wiki/AnyLang_Programming_Language_Comparison/Anylang_Common_Concepts – dreftymac

उत्तर

10

मैं वास्तव में इस योजना को उत्पादन कोड में का उपयोग करता हूं।

आवश्यकता फ़ाइलों वर्तमान स्रोत स्थान के सापेक्ष कई फायदे हैं:

  • स्रोत पेड़ एक पूरे के रूप चारों ओर ले जाया जा सकता है और प्रयोग करने योग्य रहता है क्योंकि हम अपेक्षाकृत एक दूसरे के स्रोतों की आवश्यकता है।
  • के बाद से हम पूर्ण पथ का उपयोग करें, हम माणिक के खोज पथ को संशोधित करने के बिना आकस्मिक टक्करों (एक और पुस्तकालय में एक ही नाम के साथ एक स्रोत को लोड, या एक ही स्रोत को फिर से लोड दो बार)
  • कोड इस्तेमाल किया जा सकता से बचने

आप एक संशोधित माणिक खोज पथ का उपयोग करना पसंद है, तो आप यह कई मायनों में कर सकते हैं: गहरे लाल रंग का कमांड लाइन पर मैं विकल्पों को जोड़ने

  1. सूत्रों
  2. वातावरण चर RUBYLIB

समाधान 1 के साथ खेल के भीतर $ LOAD_PATH चर को संशोधित करने को नियंत्रित कैसे माणिक शुरू हो जाती है निकलता है।

@echo off 
REM my_script.cmd 
set srcdir=%~dp0\..\path\to\source 
ruby -I %srcdir% %srcdir%\my_script.rb 

या:: आप इस तरह के रूप कार्यक्रम शुरू करने के लिए, एक स्क्रिप्ट की आवश्यकता होगी

#!/bin/sh 
srcdir=$(cd $(dirname $0)/../path/to/source && pwd) 
exec ruby -I $srcdir $srcdir/my_script.rb 

समाधान 2 व्यावहारिक है, लेकिन टकराव से बचने नहीं करता। 3 है unadvisable, कम निर्भरता आप वातावरण चर की ओर होगा, बेहतर आप हो जाएगा

$LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__))) 

समाधान: आप आम तौर पर की तरह कुछ कर देंगे।

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