rails generate example commands ruby rake command-line-interface

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}