2016-10-31 2 views
1

Ich habe eine Reihe von Rake-Aufgaben, für die ich gerne ein Umgehungs-ähnliches Verhalten implementieren würde. Insbesondere suche ich nach einer Möglichkeit, sicherzustellen, dass alle meine Rake-Aufgaben in einem bestimmten (komplizierten, abgeleiteten) Time.use_zone-Block ausgeführt werden.Wie kann ich Hake-ähnliches Verhalten für Rake-Aufgaben bekommen?

Für Analogie, ich habe dies in meinem ApplicationController:

around_filter :use_time_zone 

def use_time_zone 
    time_zone = non_trivial_derivation 
    Time.use_zone(time_zone) { yield } 
end 

Und jetzt alle meine Controller-Aktionen werden in der angegebenen Zeitzone entsprechend auszuführen. Ich hätte gerne einen Mechanismus wie diesen für Rake. Ich wäre bereit, die Abhängigkeitskette für meine Rake-Aufgaben zu ändern oder zu ändern, aber ich möchte den tatsächlichen Zeitzonen-Ableitungscode nicht an der Spitze jeder Rake-Aufgabe einfügen, aus Gründen, die zu einer Fragilität der Wartung führen würden. Ich bin ziemlich sicher, dass Rake-Abhängigkeiten die Lösung halten - schließlich erlauben Rake-Abhängigkeiten, dass ich Code im Kontext meiner Rails-Anwendung ausführen kann. Aber ich kann mir nicht vorstellen, wie man das für diesen Anwendungsfall schafft.

Antwort

2

kam ich mit einer einfachen Lösung, die keine externen Abhängigkeiten oder Edelsteine ​​benötigt wie rake-hooks:

desc "rake around hook" 
task :use_timezone, [:subtask] => :environment do |name, args| 
    puts "using timezone" 
    Rake::Task[args[:subtask]].invoke 
    puts "end using timezone" 
end 

task :testing do 
    puts "testing" 
end 

Die Idee ist, dass Sie die Haupt use_timezone Aufgabe ausführen und in Ihrer eigentlichen Aufgabe als übergeben Argument:

$ rake use_timezone[testing] 

daß Ausgänge:

> using timezone 
> testing 
> end using timezone 

Für Ihren Fall können Sie es wie folgt schreiben:

task :use_timezone, [:subtask] => :environment do |name, args| 
    time_zone = non_trivial_derivation 
    Time.use_zone(time_zone) { Rake::Task[args[:subtask]].invoke } 
end 

Und es wie folgt verwenden:

$ rake use_timezone[your_task] 

Hoffnung, das hilft.

Verwandte Themen