2012-12-07 14 views
25

वर्तमान में मैं उन्हें बेहतर बनाने के लिए अपनी रेक फ़ाइलों को विभाजित करने की कोशिश कर रहा हूं। इसके लिए, मैंने rake फ़ोल्डर को अपने assets डीआईआर में जोड़ा है, जिसमें कार्यों के प्रत्येक समूह के लिए एक रेक फ़ाइल है।लोड फ़ाइलों को लोड करें और अन्य फ़ाइलों से कार्यों को चलाएं

जैसा कि मैं PHP से आ रहा हूं, मेरे पास केवल बहुत मूल रूबी/रेक का ज्ञान है और फ़ाइल लोड करने के बाद मेरे नेमस्पेस डिफ़ॉल्ट क्रिया को नहीं चलाया जा सकता है।

बाहर commmented Rake :: Task ...app:init अंदर -string सीएल पर एक त्रुटि फेंकता है मुझ पर:

rake aborted! 
uninitialized constant TASK 

यहाँ नाम स्थान/वर्ग है (यदि यह सही शब्द है)।

task :default => [ 'app:init' ] 
namespace :app do 

    rake_dir = "#{Dir.pwd}/assets/rake/" 
    rake_files = FileList.new("#{rake_dir}*") 

    desc "Loads rake modules (Default action)" 
    task :init do 
     puts "\t Importing rake files for processing" 

     puts "\t loading..." 
     rake_files.each() { |rake| 
      puts "\t #{rake}" 
      require rake 
      # @link rubular.com 
      name = rake.split(rake_dir).last.gsub(/.rb\z/, '') 
      puts "\t #{name}" 
      #Rake :: Task[ "#{name}:default" ].invoke 
     } 
    end 
end 

अग्रिम धन्यवाद।

संपादित करें: कम से कम, मुझे यकीन है कि फ़ाइल लोड हो जाएगी, क्योंकि उन फ़ाइलों की शुरुआत में सादा puts "file loaded" सादा हो जाता है। समस्या केवल प्रतीत होती है कि लोड की गई रेक फ़ाइल में नामस्थान के लिए :default कार्रवाई लोड नहीं हो रही है।

उत्तर

31

यदि आपका लक्ष्य किसी बाहरी फ़ाइल से रेक कार्यों को लोड करना है, तो आप निम्नानुसार ऐसा कर सकते हैं। सबसे पहले, मान लीजिए कि आप एक फ़ाइल में एक रेक कार्य <project>/lib/tasks/hello.rake कि इस तरह दिखता है कहा जाता है करते हैं:

desc "Say hello" 
task :hello do 
    puts "Hello World!" 
end 

तो फिर तुम इस तरह लोड करने के लिए एक सरल Rakefile अपने <project> निर्देशिका में बना सकते हैं:

Dir.glob('lib/tasks/*.rake').each { |r| load r} 

desc "Say goodbye" 
task :goodbye do 
    puts "See you later!" 
end 

बेशक, यह rake एक्सटेंशन के साथ समाप्त होने वाली सभी फाइलें लोड करेगा। आप बस इस तरह hello.rake लोड कर सकते हैं:

load './lib/tasks/hello.rake' 

desc "Say goodbye" 
task :goodbye do 
    puts "See you later!" 
end 

सभी कार्य है कि उपयोग rake -T लोड हो जाने पर देखने के लिए। ध्यान दें कि मैंने lib/tasks का उपयोग किया है क्योंकि यह रेल अनुप्रयोगों द्वारा लिया गया मानक दृष्टिकोण है। आप assets या जो भी चाहें उसका उपयोग कर सकते हैं, हालांकि मैं गैर-रेल परियोजनाओं में भी lib/tasks पसंद करता हूं। मैं अपनी टास्क फाइलों को उनके नेमस्पेस के आधार पर अलग करता हूं।

33

आप या तो अपने कार्यों rakelib/ फ़ोल्डर में जो rake लोड डिफ़ॉल्ट रूप से रख सकते हैं या अपने Rakefile के माध्यम से में एक विशिष्ट फ़ोल्डर जोड़ें:

Rake.add_rakelib 'lib/tasks' 
+1

इस बारे में कभी नहीं पता था। धन्यवाद! – Andrew

+2

एक सुधार: आप उल्लेख कर सकते हैं कि 'लोड' फ़ाइल का उपयोग करके एकल फ़ाइलों को आसानी से लोड किया जा सकता है। आरबी "'। तो यह स्वीकार्य जवाब होना चाहिए। – Overbryd

+0

यह उत्तर संरक्षित किया जाना चाहिए। मैं इस 'rakelib/'निर्देशिका – Pred

2

तुम हमेशा Rake.add_rakelib 'tasks' उपयोग कर सकते हैं, के रूप में @splattael कहा। एक चीज जिसे आपको जानने की जरूरत है, 'कार्यों' निर्देशिका में फ़ाइलों को '.rb' के बजाय '.rake' का विस्तार होना चाहिए, अन्यथा, रेक आपके लिए लोड नहीं करेगा।

नमूना फ़ाइल:

आप ऊपर के सभी करने के बाद, अपने काम की जांच करने के लिए कि क्या रेक अपने कार्यों को सफलतापूर्वक लोड को देखने के लिए rake -T का उपयोग करें।

+0

महान जानकारी के बारे में कभी नहीं जानता था। धन्यवाद! – kaiser

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