क्या किसी अन्य रूबी लिपि से Rakefile में परिभाषित कार्य को कॉल करना संभव है - somefile.rake में नहीं?

मैं उम्मीद कर रहा था कि एक नया Rake::Application बनाने से स्वचालित रूप से उसी निर्देशिका से Rakefile लोड हो जाएगा, लेकिन ऐसा लगता है कि ऐसा नहीं है। यहाँ मैं अब तक के साथ आया हूँ:

$LOAD_PATH.unshift File.dirname(__FILE__)
require 'rake'
require 'pp'

rake = Rake::Application.new
rake[:hello].invoke

इस कोड को निष्पादित करने से निम्नलिखित परिणाम प्राप्त होते हैं:

/opt/ruby/1.9.2-p180/lib/ruby/1.9.1/rake.rb:1720:in `[]': Don't know how to build task 'hello' (RuntimeError)
from script.rb:7:in `<main>'

pp rake निम्नलिखित देता है:

#<Rake::Application:0x00000101118da0
 @default_loader=#<Rake::DefaultLoader:0x00000101118b20>,
 @imported=[],
 @last_description=nil,
 @loaders=
  {".rb"=>#<Rake::DefaultLoader:0x00000101118a80>,
   ".rf"=>#<Rake::DefaultLoader:0x000001011189b8>,
   ".rake"=>#<Rake::DefaultLoader:0x00000101118800>},
 @name="rake",
 @original_dir=
  "/Users/t6d/Projects/Sandbox/Ruby/rake-from-ruby-script",
 @pending_imports=[],
 @rakefile=nil,
 @rakefiles=["rakefile", "Rakefile", "rakefile.rb", "Rakefile.rb"],
 @rules=[],
 @scope=[],
 @tasks={},
 @top_level_tasks=[],
 @tty_output=false>

यह किसी तरह से परेशान करने वाला है कि @rakefile nil है।

अपडेट 20 मई, शाम 4:40 बजे सीईटी

थोड़ी देर के लिए रेक सोर्स कोड पढ़ने के बाद, मुझे लगा कि आपको अपने नए बनाए गए रेक एप्लिकेशन को इनिशियलाइज़ करने के लिए रेक :: एप्लिकेशन # इनिट को कॉल करने की आवश्यकता है:

rake = Rake::Application.new
rake.init
rake.load_rakefile

हालाँकि, मैं अभी भी अपने रेकफाइल में परिभाषित किसी भी कार्य को लागू नहीं कर सकता:

rake.top_level_tasks # => ["default"]

मुझे उस मामले में किसी भी मदद की खुशी होगी।

14
t6d 19 मई 2011, 02:27
1
 – 
James Moore
19 सितंबर 2011, 13:13
FWIW, वह लिंक बताता है कि एक कार्य को कैसे चलाना है, एप्लिकेशन का निर्माण करके, स्क्रिप्ट rake निष्पादन योग्य की तरह व्यवहार करेगी।
 – 
Smar
2 फरवरी 2015, 15:25

2 जवाब

सबसे बढ़िया उत्तर

आप अपने नए rake को वर्तमान रेक एप्लिकेशन में जोड़ना भूल गए हैं:

$LOAD_PATH.unshift File.dirname(__FILE__)

require 'rake'
require 'pp'

rake = Rake::Application.new
Rake.application = rake
rake.init
rake.load_rakefile

rake[:hello].invoke

या केवल

$LOAD_PATH.unshift File.dirname(__FILE__)
require 'rake'
require 'pp'

Rake.application.init
Rake.application.load_rakefile

Rake.application[:hello].invoke
18
Vasiliy Ermolovich 21 मई 2011, 16:28
प्रतिभाशाली और सही समय पर। मुझे लगने लगा था कि मुझे system rake ... जैसी किसी चीज़ का उपयोग करना पड़ सकता है, लेकिन अब मैं आपके इतने अधिक स्वच्छ समाधान का उपयोग कर सकता हूँ। बहुत - बहुत धन्यवाद!
 – 
t6d
21 मई 2011, 19:06
महान समाधान, हालांकि तर्कों के साथ कार्यों का समर्थन करने के लिए इसे थोड़ा संशोधित करने की आवश्यकता है। मेरा उत्तर यहां देखें: रेल के बिना एक रत्न"> stackoverflow.com/questions/13858495/…
 – 
KomodoDave
13 पद 2012, 16:48

बस रेकफाइल लोड करें:

==> foo.rb <==
require 'rubygems'
require 'rake'

load 'Rakefile'

Rake::Task[:some_task].invoke

==> Rakefile <==
task :some_task do
  puts "some_task"
end

रेक :: एप्लिकेशन कमांड-लाइन प्रोसेसिंग, डिफॉल्ट रेकफाइल्स, आउटपुट आदि के बारे में है। आपको इसकी आवश्यकता नहीं हो सकती है।

10
James Moore 18 सितंबर 2011, 23:45
धन्यवाद, इससे मेरी समस्या हल हो गई। मुझे लगता है कि रेकफाइल रेल में डिफ़ॉल्ट रूप से लोड हो जाएगा लेकिन ऐसा नहीं है।
 – 
Venkat D.
16 अगस्त 2012, 23:55