61 votes

Comment ratisser des tâches dans un script ruby?

J'ai un Rakefile avec une tâche de rake que j'appellerais normalement depuis la ligne de commande (blog rake: titre du post).

J'aimerais écrire un script ruby qui appelle cette tâche de râteau plusieurs fois, mais la seule solution que je vois est de décortiquer (`` ou le système).

Quelle est la bonne façon de procéder?

45voto

titanous Points 1601

de timocracy.com :

 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}
 

23voto

Kelvin Points 5810

Cela fonctionne avec la version 10.0.3 de rake:

 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
 

Comme l'a dit Knut, utilisez reenable si vous souhaitez invoquer plusieurs fois.

17voto

knut Points 10107

Vous pouvez utiliser invoke et reenable pour exécuter la tâche d'un 2ème temps.

Votre appel d'exemple rake blog:post Title semble avoir un paramètre. Ce paramètre peut être utilisé comme un paramètre en invoke:

Exemple:

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')

Veuillez remplacer mytask avec blog:post et au lieu de la définition de tâche vous pouvez require votre rakefile.

Cette solution permet d'écrire le résultat sur la sortie standard, mais vous ne le mentionne pas, que vous souhaitez supprimer de sortie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X