रूबी स्क्रिप्ट के भीतर मैं रेक कार्यों को कैसे चला सकता हूं?

मेरे पास एक रेक कोड के साथ Rakefile है जिसे मैं सामान्य रूप से कमांड लाइन से कॉल करता हूं:

rake blog:post Title

मैं एक रूबी स्क्रिप्ट लिखना चाहता हूं जो कि रेक कार्य को कई बार कॉल करता है, लेकिन मुझे लगता है कि एकमात्र समाधान `` (बैकटिक्स) या <�कोड> सिस्टम का उपयोग कर बाहर खोल रहा है।

ऐसा करने का सही तरीका क्या है?

0
जोड़ा संपादित
विचारों: 1

4 उत्तर

रेल लोड के साथ एक स्क्रिप्ट में (उदा। <�कोड> रेल धावक script.rb )

def rake(*tasks)
  tasks.each do |task|
    Rake.application[task].tap(&:invoke).tap(&:reenable)
  end
end

rake('db:migrate', 'cache:clear', 'cache:warmup')
0
जोड़ा

यह रेक संस्करण 10.0.3 के साथ काम करता है:

require 'rake'
app = Rake.application
app.init
# do this as many times as needed
app.add_import 'some/other/file.rake'
# this loads the Rakefile and other imports
app.load_rakefile

app['sometask'].invoke

चूंकि knut ने कहा, यदि आप कई बार आह्वान करना चाहते हैं तो reenable का उपयोग करें।

0
जोड़ा
हाय @ जेसनएफबी, आप मणि को app.add_import "# {Gem :: विशिष्टता.find_by_name ('स्टेट्समैन') जैसे कुछ के साथ एक्सेस कर सकते हैं। Gem_dir} / lib & zwnj; /tasks/statesman.rak‌ e"
जोड़ा लेखक spikeheap, स्रोत
यह रत्न के अंदर कार्यों के लिए काम नहीं करता है
जोड़ा लेखक Jason FB, स्रोत

कार्य को दूसरी बार निष्पादित करने के लिए आप invoke और reenable का उपयोग कर सकते हैं।

आपका उदाहरण कॉल करें रेक ब्लॉग: पोस्ट शीर्षक में पैरामीटर है। इस पैरामीटर को invoke में पैरामीटर के रूप में उपयोग किया जा सकता है:

उदाहरण:

require 'rake'
task 'mytask', :title do |tsk, args|
  p "called #{tsk} (#{args[:title]})"
end



Rake.application['mytask'].invoke('one')
Rake.application['mytask'].reenable
Rake.application['mytask'].invoke('two')

कृपया mytask को ब्लॉग: पोस्ट के साथ प्रतिस्थापित करें और इसके बजाय कार्य परिभाषा जिसे आप की आवश्यकता अपने रेकैकाइल कर सकते हैं।

यह समाधान परिणाम को stdout पर लिख देगा - लेकिन आपने उल्लेख नहीं किया है, कि आप आउटपुट को दबाना चाहते हैं।


दिलचस्प प्रयोग:

आप कार्य परिभाषा के अंदर भी reenable को कॉल कर सकते हैं। यह एक कार्य को खुद को पुन: सक्षम करने की अनुमति देता है।

उदाहरण:

require 'rake'
task 'mytask', :title do |tsk, args|
  p "called #{tsk} (#{args[:title]})"
  tsk.reenable  #<-- HERE
end

Rake.application['mytask'].invoke('one')
Rake.application['mytask'].invoke('two')

नतीजा (रेक 10.4.2 के साथ परीक्षण):

"called mytask (one)"
"called mytask (two)"
0
जोड़ा
@ जेसनएफबी क्या आपके पास एक उदाहरण है क्यों नहीं?
जोड़ा लेखक knut, स्रोत
@ जेसनएफबी मेरा संपादित उत्तर भी देखें। शायद यह आपकी समस्या का एक विकल्प है ..
जोड़ा लेखक knut, स्रोत
यह रत्न के अंदर कार्यों के लिए काम नहीं करता है
जोड़ा लेखक Jason FB, स्रोत

timocracy.com :

require 'rake'
require 'rake/rdoctask'
require 'rake/testtask'
require 'tasks/rails'

def capture_stdout
  s = StringIO.new
  oldstdout = $stdout
  $stdout = s
  yield
  s.string
ensure
  $stdout = oldstdout
end

Rake.application.rake_require '../../lib/tasks/metric_fetcher'
results = capture_stdout {Rake.application['metric_fetcher'].invoke}
0
जोड़ा
Stdout बदलने के लिए, मैं मूल स्ट्रीम को #dup के माध्यम से सहेजने का सुझाव देता हूं, फिर #reopen को Tempfile पर मूल रूप से फिर से खोलने के बाद पढ़ा जाता है। यदि कार्य STDOUT निरंतर उपयोग करता है, या बाहरी प्रोग्राम चलाता है तो केवल $ stdout असाइन करना काम नहीं करेगा।
जोड़ा लेखक Kelvin, स्रोत
रेल 3.1 के साथ रेक / रोडोक्टास्क को हटा दिया गया है और कार्य / रेल गायब हैं। उपर्युक्त केवल पहले आवश्यक कथन के साथ ठीक काम करता है।
जोड़ा लेखक jwadsack, स्रोत
ध्यान रखें कि rake_require हमेशा $ LOAD_PATH सरणी से प्रत्येक पथ के साथ दिए गए पथ में शामिल होता है और फ़ाइल के अस्तित्व के लिए जांच करता है। तो पहला तर्क सापेक्ष पथ होना चाहिए। इसे रिश्तेदार के रूप में माना जाएगा भले ही इसमें एक प्रमुख स्लैश (या गैर-यूनिक्स सिस्टम पर बैकस्लैश) शामिल है।
जोड़ा लेखक siefca, स्रोत