57

Rakefile通常はコマンド ラインから呼び出す Rake タスクがあります。

rake blog:post Title

その Rake タスクを複数回呼び出す Ruby スクリプトを書きたいのですが、唯一の解決策は `` (バッククォート) またはsystem.

これを行う正しい方法は何ですか?

4

4 に答える 4

44

timocracy.comから:

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}
于 2008-08-06T15:24:00.787 に答える
21

これは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複数回呼び出す場合に使用します。

于 2013-03-06T22:14:36.513 に答える
16

とを使用invokereenableて、もう一度タスクを実行できます。

あなたの呼び出し例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:postrequire

このソリューションは結果を 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)"
于 2012-07-17T10:06:53.430 に答える