क्या किसी अन्य रूबी लिपि से 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"]
मुझे उस मामले में किसी भी मदद की खुशी होगी।
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
system rake ...
जैसी किसी चीज़ का उपयोग करना पड़ सकता है, लेकिन अब मैं आपके इतने अधिक स्वच्छ समाधान का उपयोग कर सकता हूँ। बहुत - बहुत धन्यवाद!
बस रेकफाइल लोड करें:
==> foo.rb <==
require 'rubygems'
require 'rake'
load 'Rakefile'
Rake::Task[:some_task].invoke
==> Rakefile <==
task :some_task do
puts "some_task"
end
रेक :: एप्लिकेशन कमांड-लाइन प्रोसेसिंग, डिफॉल्ट रेकफाइल्स, आउटपुट आदि के बारे में है। आपको इसकी आवश्यकता नहीं हो सकती है।
rake
निष्पादन योग्य की तरह व्यवहार करेगी।