Comment exécuter des tâches Rake dans un script Ruby ?
-
08-06-2019 - |
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 ?
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')