Wie führe ich Rake-Aufgaben in einem Ruby-Skript aus?

  • Ich habe eine Rakefile mit einer Rake-Task, die ich normalerweise von der Befehlszeile aus aufrufen würde:

     rake blog:post Title
     

    Ich möchte ein Ruby-Skript schreiben, das diese Rake-Task mehrmals aufruft, aber die einzige Lösung, die ich sehe, ist die Verwendung von `` (Backticks) oder system.

    Wie ist dies richtig?

    20 December 2014
    the Tin ManEqbal
4 answers
  • from 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}
     
    06 August 2008
    titanous
  • Dies funktioniert mit der 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
     

    Verwenden Sie wie gesagt, reenable, wenn Sie mehrmals aufrufen möchten.

    20 December 2014
    the Tin ManEqbal
  • Mit invoke und reenable können Sie die Task ein zweites Mal ausführen.

    Ihr Beispielaufruf rake blog:post Title scheint einen Parameter zu haben. Dieser Parameter kann in invoke als Parameter verwendet werden:

    Beispiel:

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

    Bitte ersetzen Sie mytask durch blog:post und stattdessen können Sie die Aufgabe definieren require - Sie haben jedoch nicht erwähnt, dass Sie die Ausgabe unterdrücken möchten.


    Interessantes Experiment:

    Sie können reenable auch innerhalb der Aufgabendefinition aufrufen. Dadurch kann sich eine Task selbst wieder aktivieren.

    Beispiel:

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

    Das Ergebnis (getestet mit Rechen 10.4.2):

     "called mytask (one)"
    "called mytask (two)"
     
    31 May 2015
    knutEva Dias
  • In einem Skript mit geladenen Rails (z. B. 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')
     
    25 January 2017
    Dorian