generate - ruby on rails rake
¿Cómo ejecuto las tareas de Rake dentro de un script Ruby? (4)
Tengo un Rakefile
con una tarea Rake que normalmente llamaría desde la línea de comando:
rake blog:post Title
Me gustaría escribir un script de Ruby que llame a esa tarea de Rake varias veces, pero la única solución que veo es descartar usando `` (backticks) o system
.
¿Cuál es la forma correcta de hacer esto?
En un script con Rails cargado (por ejemplo, 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'')
Esto funciona con Rake versión 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
Como dijo knut, use reenable
si desea invocar varias veces.
Puede usar invoke
y reenable
para ejecutar la tarea por segunda vez.
Su ejemplo llame al rake blog:post Title
parece tener un parámetro. Este parámetro se puede usar como parámetro en invoke
:
Ejemplo:
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'')
Reemplace mytask
con blog:post
y, en su lugar, la definición de tarea puede require
su rakefile.
Esta solución escribirá el resultado en stdout, pero no mencionó que desea suprimir la salida.
Experimento interesante:
Puede llamar al reenable
también dentro de la definición de tarea. Esto permite que una tarea se vuelva a habilitar.
Ejemplo:
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'')
El resultado (probado con el rastrillo 10.4.2):
"called mytask (one)"
"called mytask (two)"
de 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}