2016-06-20 6 views
2

Ich frage mich - ist es möglich, private Helfer für Rake-Aufgaben zu erstellen, egal wie ich es versuche, sind sie im globalen Bereich verfügbar und stehen auch als Methoden für jedes Objekt zur Verfügung. Zum Beispiel:Ist es möglich, ein Modul in Rake-Aufgaben einzubeziehen, ohne den globalen Geltungsbereich zu belasten?

## this is what I need 

module MyRakeHelpers 
    def helper_1 
    end 

    def helper_2 
    end 
end 

include RakeHelpers 

task :sometask do 
    helper_1 
    helper_2 
end 

## And this should not work: 

# global scope 
helper_1 

"a random object".helper_1 

class RandomClass 
    def foo 
    helper_1 
    end 
end 
+0

Ich habe dies in ein Rakefile eingefügt und 'rake somethask' ausgeführt und es explodierte, weil helper_1 nicht definiert ist – kleaver

+0

Offensichtlich ist es ein Teil der Frage, ob ich die' MyRakeHelpers' korrekt in eine Aufgabe integrieren könnte würde es nicht fragen :) –

+0

Ok Ich habe das nicht verstanden von der Frage, ich dachte, dass der obige Code irgendwie funktioniert und Sie wollten wissen, warum – kleaver

Antwort

3

Hier ist, was für mich gearbeitet :

module MyRakeHelpers 
    def helper 
    puts 'foo' 
    end 
end 

module MyRakeTasks 
    extend Rake::DSL 
    extend MyRakeHelpers 

    task :some_task do 
    helper 
    end 
end 

In shor t, Sie können die Rake DSL in einem anderen Umfang verwenden, indem Sie (oder erweitern) Rake::DSL. Vom source:

DSL ist ein Modul, das #task bietet, #desc, #namespace usw. Verwenden Sie diese Funktion, wenn Sie Rake außerhalb der Top-Level-Rahmen verwenden möchten. Für ein Rakefile, das Sie über die Befehlszeile ausführen, wird dieses Modul automatisch eingebunden.

task verwendet Rake::Task#define_task unter der Haube, die Sie auch Ihre eigene DSL schreiben benutzen können.

Dank How To Build Custom Rake Tasks; The Right Way für den Tipp über define_task.

1

ich glaube, Sie Ihre Rake Aufgabe wie folgt schreiben kann:

module MyRakeHelpers 
    def helper_1 
    end 

    def helper_2 
    end 
end 

task :sometask do 
    include RakeHelpers 
    helper_1 
    helper_2 
end 
+1

Nein, das würde eigentlich den globalen Namensraum verschmutzen, es ist einfach nicht offensichtlich as 'include' passiert nur, wenn die Aufgabe aufgerufen wird. Sie können etwas wie "nur eine Zeichenkette" .helper_1' in den ': somtask' Block einfügen und es wird gut funktionieren, aber es sollte nicht funktionieren. Und all diese Helfer werden überall in der App verfügbar, sobald das 'include' aufgerufen wurde. –

1

Erste anwser: Ist das, was Sie suchen?

module MyRakeHelpers 
    def self.helper_1 
    puts 'helper_1' 
    end 

    def self.helper_2 
    puts 'helper_2' 
    end 
end 

task :sometask do 
    MyRakeHelpers.helper_1 
    MyRakeHelpers.helper_2 
end 

Zweite Antwort: Das einzige, was ich denken kann, ist so etwas wie dieses

module MyRakeHelpers 
    def helper_1 
    puts 'helper_1' 
    end 

    def helper_2 
    puts 'helper_2' 
    end 
end 

task :sometask do |t| 
    t.extend MyRakeHelpers 
    t.helper_1 
end 

Aber Sie werden die t überall hinzufügen müssen

+0

sollten Sie die Schnittstelle des Moduls nicht verschmutzen müssen, um auf die Methode zugreifen zu können. Wenn Sie es nur in den Bereich der Rake-Task, der Instanz von Aufrufmethoden in Ihrem Modul, aufnehmen, erreichen Sie dasselbe, aber öffnen Sie sich für weniger Code-Missbrauch. – Sean

+1

Nein, das ist eine offensichtliche Lösung, aber das ist nicht das, wonach ich suche. Ich habe ein Projekt mit Hunderten von Rake-Aufgaben und etwa der gleichen Anzahl von globalen Helfern, denen jeder Modulname etwas zu schwer fällt . –

Verwandte Themen