我有一個Rakefile
用耙子任務,我通常會在命令行稱:如何在Ruby腳本中運行Rake任務?
rake blog:post Title
我想編寫一個Ruby腳本調用該Rake任務多次,但唯一的解決辦法,我看正在使用``(反引號)或system
進行脫殼。
什麼是正確的方法來做到這一點?
我有一個Rakefile
用耙子任務,我通常會在命令行稱:如何在Ruby腳本中運行Rake任務?
rake blog:post Title
我想編寫一個Ruby腳本調用該Rake任務多次,但唯一的解決辦法,我看正在使用``(反引號)或system
進行脫殼。
什麼是正確的方法來做到這一點?
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}
您可以使用invoke
和reenable
執行任務第二次。
您的示例電話rake blog:post Title
似乎有一個參數。此參數可以在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')
請blog:post
取代mytask
,而是任務定義,你可以require
您的Rake文件。
此解決方案將結果寫入標準輸出 - 但您沒有提到,您想要抑制輸出。
有趣的實驗:
你可以打電話給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)"
這適用於耙版本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
正如克努特所述如果要多次調用,請使用reenable
。
在使用Rails腳本加載(例如rails runner 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')
使用Rails 3.1耙/ rdoctask已棄用,任務/導軌丟失。只需要第一條要求聲明,上述工作就可以完成。 – jwadsack 2012-01-09 21:07:44
爲了改變stdout,我建議通過`#dup`將原始流保存,然後`#reopen`複製到`Tempfile`中,在重新打開原始文件後讀取它。如果任務使用STDOUT常量或運行外部程序,僅分配`$ stdout`將不起作用。 – Kelvin 2013-03-06 22:29:06
請注意,`rake_require`總是將給定路徑與`$ LOAD_PATH`數組中的每條路徑連接起來,並檢查是否存在文件。所以第一個參數應該是**相對路徑**。即使它包含前導斜槓(或非Unix系統上的反斜槓),它也會被視爲相對。 – siefca 2013-12-04 15:55:06