Vă mulțumim pentru susținere

Cum pot executa sarcinile Rake într-un script Ruby?

Am un cod Rakefile cu o sarcină Rake pe care o voi apela în mod normal din linia de comandă:

rake blog:post Title

Aș dori să scriu un script de tip ruby care solicită sarcina Rake de mai multe ori, dar singura soluție pe care o văd este scoaterea folosind `` (backticks) sau system .

Care este modul potrivit de a face asta?

0
adăugat editat
Vizualizări: 1

4 răspunsuri

Într-un script încărcat cu Rails (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')
0
adăugat

Aceasta funcționează cu versiunea Rake 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

După cum a spus knut, utilizați reenable dacă doriți să invocați de mai multe ori.

0
adăugat
Bună @JasonFB, puteți accesa bijuterie cu ceva de genul app.add_import "# {Gem :: Specification.find_by_name ( 'om de stat') gem_dir.} / Lib & zwnj; /tasks/statesman.rak‌ e"
adăugat autor spikeheap
acest lucru nu funcționează pentru sarcinile din interiorul Gems
adăugat autor Jason FB

Puteți folosi invoke și reenable pentru a executa sarcina a doua oară.

Exemplul dvs. de apel rake blog: post Title pare să aibă un parametru. Acest parametru poate fi folosit ca 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')

Înlocuiți mytask cu blog: post și în locul definiției sarcinii puteți solicita </​​code> rakefile-ul.

Această soluție va scrie rezultatul la stdout - dar nu ați menționat, că doriți să suprimați ieșirea.


Experiment interesant:

Puteți apela reenable și în interiorul definiției sarcinii. Acest lucru permite unei sarcini să se reînnoiască.

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 rake 10.4.2):

"called mytask (one)"
"called mytask (two)"
0
adăugat
@JasonFB Ai un exemplu de ce nu?
adăugat autor knut
@JasonFB Vezi și răspunsul meu editat. Poate că aceasta este o alternativă pentru problema dvs.
adăugat autor knut
acest lucru nu funcționează pentru sarcinile din interiorul Gems
adăugat autor Jason FB

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}
0
adăugat
Pentru a schimba stdout, vă sugerăm să salvați fluxul original prin #dup , apoi #reopen la un Tempfile care se citește după redeschiderea originalului. Numai atribuirea $ stdout nu va funcționa dacă sarcina utilizează constanta STDOUT sau rulează un program extern.
adăugat autor Kelvin
Cu Rails 3.1 rake / rdoctask a fost depreciat și sarcinile / șinele lipsesc. Cele de mai sus funcționează foarte bine doar cu prima solicitare de solicitare.
adăugat autor jwadsack
Rețineți că rake_require se alătură întotdeauna căii date cu fiecare cale din matricea $ LOAD_PATH și verifică existența unui fișier. Deci, primul argument ar trebui să fie o cale relativă . Acesta va fi tratat ca fiind relativ chiar dacă conține un slash (sau un backslash pe sisteme non-Unix).
adăugat autor siefca