2011-05-18 62 views
13

是否可以從其他Ruby腳本中調用在Rakefile中定義的任務 - 而不是在somefile.rake中?如何從其他Ruby腳本調用標準Rakefile中定義的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> 

它以某種方式刺激該@rakefilenil

更新5月20日,下午4:40 CET

閱讀耙源代碼,一小會兒後,我想通了,你需要調用的Rake ::應用#的init,以初始化新創建耙應用:

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

但是,我還是不能調用我的Rake文件中定義的任何任務:

rake.top_level_tasks # => ["default"] 

我很高興感謝任何幫助。

+1

查看http://stackoverflow.com/questions/3530/how-do-i-rake-tasks-within-a-ruby-script too – 2011-09-19 09:13:27

+0

FWIW,該鏈接通過構建應用程序告訴如何運行一個任務,該腳本將更像「rake」可執行文件。 – Smar 2015-02-02 12:25:42

回答

17

你忘了你的新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 
+0

天才和正確的時間。我開始認爲我可能不得不使用'system rake ...'之類的東西,但現在我可以使用你的更清潔的解決方案。非常感謝! – t6d 2011-05-21 15:06:30

+0

偉大的解決方案,儘管它需要稍微修改以支持具有參數的任務。看到我的答案在這裏:http://stackoverflow.com/questions/13858495/ruby-accessing-rake-task-from-a-gem-without-rails/13860134 – KomodoDave 2012-12-13 12:48:53

10

只是加載的Rakefile:

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

load 'Rakefile' 

Rake::Task[:some_task].invoke 

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

耙::應用程序所有關於命令行處理,默認rakefiles,輸出等等。您可能不需要任何這些。

+0

謝謝,這解決了我的問題。我認爲Rakefile默認會在Rails中加載,但事實並非如此。 – 2012-08-16 19:55:37