Rakefile
通常はコマンド ラインから呼び出す Rake タスクがあります。
rake blog:post Title
その Rake タスクを複数回呼び出す Ruby スクリプトを書きたいのですが、唯一の解決策は `` (バッククォート) またはsystem
.
これを行う正しい方法は何ですか?
Rakefile
通常はコマンド ラインから呼び出す Rake タスクがあります。
rake blog:post Title
その Rake タスクを複数回呼び出す Ruby スクリプトを書きたいのですが、唯一の解決策は `` (バッククォート) またはsystem
.
これを行う正しい方法は何ですか?
require 'rake'
def capture_stdout
s = StringIO.new
oldstdout = $stdout
$stdout = s
yield
s.string
ensure
$stdout = oldstdout
end
Rake.application.rake_require 'metric_fetcher', ['../../lib/tasks']
results = capture_stdout {Rake.application['metric_fetcher'].invoke}
これはRakeバージョン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
複数回呼び出す場合に使用します。
とを使用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')
rakefileのタスク定義に置き換えmytask
てください。blog:post
require
このソリューションは結果を 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')
結果 (rake 10.4.2 でテスト):
"called mytask (one)"
"called mytask (two)"