Cum pot rula sarcini rake într-un script Ruby?

voturi
49

Am o Rakefilecu o sarcină Rake pe care aș numi în mod normal , din linia de comandă:

rake blog:post Title

Aș vrea să scrie un script Ruby care solicită această sarcină Rake de mai multe ori, dar singura soluție văd este decojirea folosind `` (backticks) sau system.

Care este modul corect de a face acest lucru?

Întrebat 06/08/2008 la 16:15
sursa de către utilizator
În alte limbi...                            


4 răspunsuri

voturi
43

de la 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}
Publicat 06/08/2008 la 16:24
sursa de către utilizator

voturi
17

Acest lucru funcționează cu versiunea 10.0.3 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

Așa cum a spus Knut, utilizați reenabledacă doriți să invoce de mai multe ori.

Publicat 06/03/2013 la 23:14
sursa de către utilizator

voturi
13

Puteți folosi invokeși reenablepentru a executa sarcina de a doua oară.

De exemplu , apelul dumneavoastră rake blog:post Titlepare să aibă un parametru. Acest parametru poate fi utilizat ca un parametru în invoke:

Exemplu:

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

Vă rugăm să înlocuiți mytaskcu blog:postși în loc definiția sarcina poți requirerakefile ta.

Această soluție se va scrie rezultatul la iesirea standard - dar nu a menționat, că doriți să suprime ieșire.


experiment interesant:

Aveți posibilitatea de a apela , de reenableasemenea , în interiorul definiției sarcinii. Acest lucru permite o sarcină să se reactivați.

Exemplu:

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

Rezultatul (testat cu 10.4.2 rake):

"called mytask (one)"
"called mytask (two)"
Publicat 17/07/2012 la 11:06
sursa de către utilizator

voturi
1

Într - un scenariu cu bare încărcate ( de exemplu 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')
Publicat 24/01/2017 la 22:09
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more