Question

j'ai un Rakefile avec une tâche Rake que j'appellerais normalement depuis la ligne de commande :

rake blog:post Title

J'aimerais écrire un script Ruby qui appelle cette tâche Rake plusieurs fois, mais la seule solution que je vois consiste à utiliser `` (backticks) ou system.

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

Était-ce utile?

La solution

depuis timocratie.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}

Autres conseils

Cela fonctionne avec Rake version 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

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

Vous pouvez utiliser invoke et reenable pour exécuter la tâche une seconde fois.

Votre exemple d'appel rake blog:post Title semble avoir un paramètre.Ce paramètre peut être utilisé comme paramètre dans 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 à la place la définition de la tâche que vous pouvez require votre fichier rake.

Cette solution écrira le résultat sur la sortie standard - mais vous n'avez pas mentionné que vous souhaitez supprimer la sortie.


Expérience intéressante :

Vous pouvez appeler le reenable également à l'intérieur de la définition de la tâche.Cela permet à une tâche de se réactiver.

Exemple:

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

Le résultat (testé avec rake 10.4.2) :

"called mytask (one)"
"called mytask (two)"

Dans un script avec Rails chargé (par ex. 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')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top