2010-06-12 11 views
6

मैं अपनी परियोजनाओं को पेड़ में गहरी रेकैकाइल का उपयोग करके चीजों का निर्माण करने के लिए शीर्ष स्तर रेकैकाइल चाहता हूं; यानी शीर्ष स्तर के रेकफाइल का कहना है कि परियोजना (बड़ी तस्वीर) कैसे बनाएं और निचले स्तर वाले लोग एक विशिष्ट मॉड्यूल (स्थानीय चित्र) का निर्माण कैसे करें।रेक कैसे रिकर्सिव करें? - या उपयुक्त विकल्प

निश्चित रूप से कार्यों के बीच साझा किए जाने के मिनट के विवरण के लिए कॉन्फ़िगरेशन का एक साझा सेट है: इसलिए यह ज्यादातर स्रोतों के निर्माण के रूप में निर्माण की आवश्यकता के विवरणों को रखने के बारे में है। जैसे/स्रोत/मॉड्यूल /code.foo और cie/स्रोत/मॉड्यूल/रेकैकाइल में निर्देशों का उपयोग करके बनाया जाना चाहिए; और/Rakefile मॉड्यूल के बीच निर्भरताओं को समझता है।

मुझे परवाह नहीं है कि यह एकाधिक रेक प्रक्रियाओं (एला रिकर्सिव मेक) का उपयोग करता है, या सिर्फ अलग बिल्ड वातावरण बनाता है। किसी भी तरह से यह एक कतार द्वारा संसाधित करने के लिए पर्याप्त आत्मनिर्भर होना चाहिए: ताकि गैर-निर्भर मॉड्यूल एक साथ बनाया जा सके।

समस्या यह है कि आप वास्तव में रेक के साथ ऐसा कुछ कैसे करते हैं !? मैं इंटरनेट पर और न ही प्रलेखन में सार्थक कुछ भी खोजने में सक्षम नहीं हूं। मैंने एक नया रेक :: एप्लिकेशन ऑब्जेक्ट बनाने और इसे स्थापित करने का प्रयास किया, लेकिन जो कुछ भी methods मैं आविष्कार करने का प्रयास करता हूं, केवल अपवाद या "कार्य को कैसे बनाना है" नहीं जानते: डिफ़ॉल्ट त्रुटियां फेंक दी जाती हैं। (हाँ, सभी रेकैकाइलों में एक है: डिफ़ॉल्ट)। स्पष्ट रूप से कोई एक उप निर्देशिका में 'रेक' निष्पादित कर सकता है: मॉड्यूलनाम कार्य, लेकिन यह शीर्ष स्तर पर दिए गए विकल्पों को हटा देगा; जैसे $ (मेक) और $ (MAKEFLAGS) के बारे में सोचें।

किसी के पास recursive रेक जैसे ठीक से कुछ करने के तरीके पर कोई सुराग है?

उत्तर

2

आप require अन्य रेक फ़ाइलों से रेक फाइलें और आवश्यक फ़ाइल से कार्यों को चला सकते हैं।

rakefile.rb में रखते:

require 'foo/rakefile.rb' 

task :default => [:bar] 

foo/rakefile.rb में रखते:

task :bar do 
    puts "baz" 
end 

रूट स्तर rakefile चलाने के लिए और यह स्क्रीन पर "baz" प्रिंट होगा। आपको अपनी रेक फाइलों और सामान्य कोड को व्यवस्थित करने में सक्षम होना चाहिए, हालांकि आप इस विचार का उपयोग करना चाहते हैं

0

यदि मुझे अच्छी तरह से समझ में आया तो आपको एक समस्या है कि आपको एक अन्य रेक कार्य को किसी अन्य रेकैक से एक रेक रेक कॉल करने की आवश्यकता है।

आप अपने आवश्यक कार्यों को/स्रोत/मॉड्यूल/रेकैकाइल में जिस तरह से चाहते हैं उसे बना सकते हैं और/Rakefile में एक और रेकैकाइल बना सकते हैं और इस तरह से कार्य चला सकते हैं।

desc 'Description' 
task :foo do 
    %x[rake -f /Source/Module/RakeFile foo:bar] 
end 

-f आपके द्वारा निर्धारित जहां Rakefile

तुम भी जहाँ आपके rakelib फ़ोल्डर आर के साथ स्थित है निर्दिष्ट कर सकते हैं स्थित है करते हैं।

rake -f /path/to/Rakefile -R /path/to/rakelib foo:bar 

मुझे आशा है कि यह आपकी मदद करेगा।

+0

रेक -f का नकारात्मक पहलू यह लागू rakefile के स्थान पर काम कर निर्देशिका निर्धारित नहीं करता है। –

0

मैं भी इसी तरह की आवश्यकता है और निम्नलिखित समारोह

rakeutils बनाया।rb:

def subdirs dirs 
    dirs.each do |d| 
     task d do |t| 
     sh("cd #{t.name} && pwd && rake") 
     end 
    end 
    task :default => dirs 
end 

और Rakefiles, जहाँ भी मैं यह सुविधा चाहते हैं, उसमें, मैं सिर्फ यह शामिल हैं ... उदाहरण के लिए

Rakefile:

require 'rakeutils' 

task :test1 do 
    puts "Hi" 
end 

task :default => :test1 
subdirs ["ab", "cd"] 

विकल्पों के बारे में, मैं लगता है did not किसी भी उन्हें पारित करने का स्वचालित तरीका ... "रेक" संपादित करने और विकल्पों को कैप्चर करने से पहले विकल्प को कैप्चर करने से पहले

+0

बीटीडब्ल्यू, उपर्युक्त कोड में एक और सीमा है कि "-n या --dry-run" प्रदान किए जाने पर यह रिकर्सली सूख नहीं सकता है। यदि आप वास्तव में रिकर्सिव रेक के पास गुजरने वाले विकल्पों के साथ रिकर्सली ड्राई रन करना चाहते हैं, तो कृपया मेरा अन्य उत्तर – siva008

2

जैसा कि मेरी पिछली पोस्ट में बताया गया है, यहां कोड स्नैप है ippet जो लगभग गुजरने वाले रेक व्यवहार की तरह समर्थन करता है जिसमें विकल्प गुजरने, सूखे-दौड़, ट्रेस, शीर्ष-स्तर-कार्य शामिल हैं।

रेक:

#!/usr/bin/env ruby 

begin 
    require 'rubygems' 
    gem 'rake' 
rescue LoadError 
end 

$sub_directories = [] 
$top_level_task_provided__skip_subdir = 0 
module Rake 
    REDUCE_COMPAT = true if ARGV.include?("--reduce-compat") 
    RAKE_OPTS = ARGV.clone.join(" ") 
    module DSL 
    def subdirs dirs 
     puts "DIRS: #{dirs}" 
     $sub_directories = dirs 
    end 
    end 
end 

require 'rake' 

Rake.application.standard_exception_handling do 
    Rake.application.init 
    $top_level_task_provided__skip_subdir = 1 if Rake.application.top_level_tasks.size >= 1 and Rake.application.top_level_tasks[0] != "default" 
    Rake.application.load_rakefile 
    if Rake.application.tasks.size == 0 and $sub_directories.size != 0 then 
     desc "Default task when only subdirs is present in a rakefile" 
     task :default do 
     puts "Default subdir task" 
     end 
    end 
    Rake.application.top_level 
end 

if $top_level_task_provided__skip_subdir == 0 then 
    $sub_directories.each do |d| 
     unless rake_system("cd #{d} && pwd && ruby #{File.expand_path $0} #{Rake::RAKE_OPTS}") then 
      exit(1) 
     end 
    end 
end 
+0

देखें कृपया ध्यान दें, इस स्क्रिप्ट को केवल ruby2.0 और रेक 0.9.6 के साथ परीक्षण किया जाता है। "रेक" आंतरिक में कोई भी परिवर्तन, उपरोक्त कोड तोड़ सकता है – siva008

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