2010-06-27 11 views
9

मैं रूबी मणि पर काम कर रहा हूं जो HTML उत्पन्न करने के लिए कॉन्फ़िगर करने योग्य "टेम्पलेट्स" का उपयोग करता है। मैं मणि के साथ टेम्पलेट का मूल सेट शामिल करना चाहता हूं, और उपयोगकर्ताओं को बेहतर/अधिक अनुकूलित वाले लोगों के साथ ओवरराइड करने की अनुमति देता हूं। ये टेम्पलेट रूबी कोड नहीं हैं, वे "बस फाइलें" हैं जिन्हें कोड में किसी बिंदु पर डिस्क से पढ़ने की आवश्यकता है।रूबी जेम में डेटा फ़ाइलों को कैसे शामिल करें?

मैंने रूबीजम्स दस्तावेज को देखा लेकिन वे (पूरी तरह से अनुचित नहीं) धारणा करते हैं कि एक मणि में केवल कोड होता है (ठीक है, कुछ दस्तावेज और विशिष्ट मेटा-डेटा फ़ाइलों को अच्छी माप के लिए फेंक दिया जाता है)। "/ Usr/share/..." फ़ाइलों के बराबर बनाने के लिए कोई संदर्भ नहीं है।

मणि में ऐसी फ़ाइलों को शामिल करने के लिए सबसे अच्छा अभ्यास क्या है? क्या मुझे बस उन्हें "स्रोत" के हिस्से के रूप में शामिल करना चाहिए? यदि हां, तो मैं उनके पथ को कैसे खोजूं ताकि मैं उन्हें डिस्क से टेम्पलेट प्रोसेसर में पढ़ सकूं?

उत्तर

10

मान लीजिए आप इस तरह की एक परियोजना संरचना है:

bin/ 
|__ foobar* 
lib/ 
|__ foobar/ 
| |__ templates/ 
| | |__ a/ 
| | |__ b/ 
|___|__ meta.rb 
|___|__ utils.rb 

lib/foobar/teplates निर्देशिका में आप अपने टेम्पलेट निर्देशिका या फ़ाइलों की है।

lib/foobar/meta.rb फ़ाइल में आपके प्रोजेक्ट का नाम और संस्करण शामिल है। नाम के साथ समन्वयित करना महत्वपूर्ण है (विशेष रूप से एक संस्करण संख्या) आपके मणि विनिर्देश में प्रोजेक्ट का संस्करण। (यह करने के लिए सबसे अच्छा तरीका है Rakefile से meta.rb पढ़ा जाता है कल्पना करने के लिए मूल्यों को पारित करने के लिए।)

उदाहरण के लिए, meta.rb की तरह लग रहे हो सकता है:

module Foobar 
    module Meta 
    NAME = 'foobar' 
    VERSION = '0.1.2' 
    end 
end 

फिर एक समारोह है कि करने के लिए एक पूर्ण पथ लौट बारे में lib निर्देशिका चाहे आप स्रोतों से निर्देशिका से अपनी परियोजना का परीक्षण कर रहे हों या परियोजना rubygems से स्थापित है।

utils.rb:

require_relative 'meta' 

module Foobar 
    module Utils 

    # Return a directory with the project libraries. 
    def self.gem_libdir 
     t = ["#{File.dirname(File.expand_path($0))}/../lib/#{Meta::NAME}", 
      "#{Gem.dir}/gems/#{Meta::NAME}-#{Meta::VERSION}/lib/#{Meta::NAME}"] 
     t.each {|i| return i if File.readable?(i) } 
     raise "both paths are invalid: #{t}" 
    end 

    # [...] 
    end 
end 

होने Foobar::Utils.gem_libdir समारोह आप हमेशा bin/foobar फ़ाइल में अपने टेम्पलेट्स पढ़ सकते हैं:

require_relative '../lib/foobar/utils' 

puts Dir[Foobar::Utils.gem_libdir + '/*'] 
puts Foobar::Utils.gem_libdir + '/templates/a/blah-blah' 
संबंधित मुद्दे