Rechen 201

In diesem zweiten Artikel über Rake gehen wir ein wenig tiefer und behandeln leicht fortgeschrittene Themen wie Dateiaufgaben, Regeln, Multitasks und mehr, die Ihre Rake-Chops erheblich verbessern werden.

Themen

  • Haftungsausschluss
  • Standardaufgabe
  • Das Aufgabenobjekt
  • Dateiaufgaben
  • Verzeichnismethode
  • Datei-Dienstprogramme
  • Regeln
  • Trace-Flag
  • Parallele Aufgaben

Haftungsausschluss

Ich möchte dieses Thema aus einem allgemeineren Blickwinkel betrachten. Dies ist kein Artikel, der eine Liste von Rake-Aufgaben mit cleveren Lösungen zeigt, die ohne viel Nachdenken kopiert und eingefügt werden können. Es ist eher dazu gedacht, einen Blick unter die Haube zu werfen und gleichzeitig Neulinge-freundlich zu sein und auch für Leute interessant, die mit Rake noch nicht viel gespielt haben, abgesehen von den offensichtlichen Rake-Aufgaben in Rails. 

Ich denke, es ist das Verständnis des Tools und das, was es bietet, was zu einer höheren Rendite führt. Ich hoffe es macht dir nichts aus. Für mich ist das Abdecken der Prinzipien wertvoller - und für Anfänger zugänglicher - und es liegt an Ihnen, was Sie damit in Ihren eigenen Anwendungen tun.

Standardaufgabe

Ich bin mir sicher, dass Sie den Begriff irgendwo schon einmal gehört haben. Aber was ist eigentlich eine Standardaufgabe? Es ist nichts Magisches, aber lassen Sie uns das schnell aus dem Weg schaffen. Wenn du rennst Rechen Ohne zusätzlichen Namen für eine Rake-Task wird die Standard-Task ausgeführt.

Schale

Rechen

Irgendein Rakefile

desc 'Dies ist die Standardaufgabe. Keine Argumente erforderlich 'task: default do setzt' Einige Aufgaben, die Sie möglicherweise regelmäßig ausführen möchten '

In Rails soll die Standardaufgabe Ihre Tests ausführen. Ihre Vermutung ist so gut wie meine, aber ich nehme an, es war das Ergebnis von Tests, die öfter durchgeführt werden mussten als jede andere Aufgabe. Wenn Sie das neu definieren Standard Die Rake-Aufgabe in Rails summiert sich einfach zu der von Rails definierten Aufgabe - sie wird nicht neu definiert. So funktioniert Rake. Wenn Sie eine Rake-Aufgabe neu definieren, addieren Sie sich zu den vorherigen Definitionen.

Dateiaufgaben

Wie der Name vermuten lässt, handelt es sich dabei um Aufgaben, die Sie für Dateien (und Verzeichnisse) ausführen. Sie haben jedoch ein paar Tricks an den Ärmeln. Rake arbeitet natürlich viel mit Dateien. Es überrascht nicht, dass jemand dieses Muster erkannt hat und spezielle Dateiaufgaben zu Ihrer Bequemlichkeit erstellt hat - insbesondere aus dem einfachen Grund, um Duplizierungen zu vermeiden oder Verarbeitungsfunktionen zu verschwenden.

Das Umwandeln von Dateien von einem Typ in einen anderen ist eine sehr häufige Aufgabe. Die Quellen sind Ihre Abhängigkeiten und die Aufgabennamen folgen dem Datei Stichwort. Markdown in HTML-Dateien konvertieren, HTML-Dateien in E-Book-Formate konvertieren, JPG-Bilder in PNG-Bilder konvertieren, Quellcode kompilieren, statische Seiten erstellen oder einfach nur Dateierweiterungen ändern. Viele weitere Optionen stehen Ihnen zur Verfügung. Wir könnten das alles manuell machen, aber das ist natürlich langwierig und ineffektiv. Das Schreiben von Code dafür ist viel eleganter und skalierbarer.

Die Verwendung von Datei-Tasks unterscheidet sich nicht wesentlich von „normalen“ Tasks. Sie werden auch angezeigt, wenn Sie eine Liste der Rake-Aufgaben über anfordern Rechen -T. Tatsächlich behandelt Rake alle Aufgaben gleichermaßen Multitask ein bisschen. Das Hinzufügen von Beschreibungen und Voraussetzungen ist auch für Dateiaufgaben kein Problem. 

Tatsächlich sind Voraussetzungen erforderlich, um Quelldateien vor ihrer Verarbeitung zu erwähnen. Wir brauchen die Quelle, damit dies funktioniert - was natürlich als Abhängigkeit sinnvoll ist. Ohne sie wäre Rake nicht in der Lage, fortzufahren, denn die neue Datei kann nicht aus dem Nichts erzeugt werden.

Irgendein Rakefile

Datei 'mi6 / q / gadgets / secret_list.md' => 'mi6 / research / secret_list.md' do cp 'mi6 / research / secret_list.md', 'mi6 / q / gadgets / secret_list.md' beenden

Der Name Ihrer Dateiaufgabe ist im Wesentlichen Ihre Zieldatei, die Datei, die Sie erstellt haben möchten. Voraussetzung ist die Quelldatei, die für die Aufgabe benötigt wird. Innerhalb des Blocks erklären Sie Rake, wie Sie die gewünschte Ausgabe erstellen, um sie mit den bereits vorhandenen Voraussetzungsdateien zu erstellen. Input-Output. Dies könnte zum Beispiel ein Shell-Befehl sein, der die Pandoc Werkzeug, das Markdown-Dateien in HTML-Dateien umwandelt. Die Anwendungen für Dateiaufgaben sind mehr als reichlich. Die Syntax fühlt sich jedoch auf den ersten Blick etwas komisch an. Ich verstehe es.

Rake prüft zuerst, ob die Zieldatei vorhanden ist, und prüft in diesem Fall, ob der Zeitstempel älter ist als die vorausgesetzten Dateien. Dies ist eine zeitabhängige Abhängigkeit. Rake führt die Dateiaufgabe aus, wenn der Zeitstempel älter ist als die Voraussetzungen oder wenn die Datei noch nicht vorhanden ist. Das ist sehr praktisch, wenn Sie mehr als ein paar Dateien bearbeiten müssen - was besonders cool ist, weil Sie nicht jede Menge Dateien neu erstellen müssen, nur weil Sie beispielsweise eine einzelne Datei in einer Sammlung geändert haben. Im Gegensatz dazu werden reguläre Rake-Aufgaben immer ausgeführt - sie prüfen keine Zeitstempel oder andere Änderungen, es sei denn, Sie machen das natürlich.

Datei-Dienstprogramme

Irgendein Rakefile

desc 'Dateierweiterung ändern' Datei 'some_file.new_extension' => 'some_file.old_extension' do mv 'some_file.old_extension', 'some_file.new_extension' end

Schale

$ rake some_file.new_extension => mv some_file.old_extension some_file.new_extension

Falls Sie sich über die Frage wundern cp Methode im vorherigen Beispiel oder oben mv Befehl, lassen Sie uns über Datei-Dienstprogramme sprechen. Wir hätten verwenden können sh mv… Ausführen eines Shell-Befehls innerhalb einer Rake-Task. Glücklicherweise können wir ein Modul verwenden, das Shell-Befehlsmaterial wie dieses viel weniger ausführlich und plattformunabhängig macht. FileUtils ist ein Ruby-Modul mit vielen Unixy-Befehlen für Dateioperationen: 

  • rm 
  • cp 
  • mv
  • mkdir
  • und so weiter…

Wenn Sie das Rad nicht neu erfinden möchten, ist FileUtils ein nützlicher Begleiter bei der Bearbeitung von Dateien. Oft ist Rake alles was Sie brauchen, aber ab und zu werden Sie wirklich froh sein, dass dieses praktische Modul Ihnen den Rücken gekehrt hat. RakeUtils Dieses Modul wurde für Ihre Bequemlichkeit leicht erweitert. 

Werfen wir einen Blick auf eine Liste mit dem, was Ihnen zur Verfügung steht, und schauen Sie sich ein paar Details an, die für Sie von Interesse sein könnten:

cd (Verzeichnis, Optionen) CD (Verzeichnis, Optionen) | dir |… pwd () mkdir (Verzeichnis, Optionen) mkdir (Liste, Optionen) mkdir_p (Verzeichnis, Optionen) mkdir_p (Liste, Optionen) rmdir (Verzeichnis, Optionen) ) rmdir (Liste, Optionen) ln (alte, neue Optionen) ln (Liste, destdir, Optionen) ln_s (alte, neue Optionen) ln_s (Liste, destdir, Optionen) ln_sf (src, dest, Optionen) cp (src , dest, Optionen) cp (Liste, Verzeichnis, Optionen) cp_r (src, Ziel, Optionen) cp_r (Liste, Verzeichnis, Optionen) mv (src, Ziel, Optionen) mv (Liste, Verzeichnis, Optionen) rm (Liste, Optionen.) ) rm_r (list, options) rm_rf (list, options) install (src, dest, mode = , Optionen) chmod (Modus, Liste, Optionen) chmod_R (Modus, Liste, Optionen) chown (Benutzer, Gruppe, Liste, Optionen) chown_R (Benutzer, Gruppe, Liste, Optionen) touch (Liste, Optionen)

Obwohl ich davon ausgehe, dass Sie ein Neuling sind, gehe ich davon aus, dass Sie bereits mit Rails gespielt haben und dass Sie die grundlegenden Unix-Dienstprogramme kennen mv, CD, pwd, mkdir und Zeug. Wenn nicht, machen Sie Ihre Hausaufgaben und kommen Sie zurück. 

In Ihren Rakefiles können Sie diese Methoden direkt verwenden. Um Missverständnissen vorzubeugen, handelt es sich hierbei um eine Ruby-Ebene, die diese Unix-Befehle "imitiert" und in Ihren Rakefiles ohne Präfixe verwendet werden kann Sch-zum Ausführen eines Shell-Befehls. Übrigens die Optionen Sie sehen in der Liste oben einen Hash von Optionen. Schauen wir uns einige interessante Befehle an, die in praktischen Aufgaben beim Schreiben von Dateien hilfreich sein könnten:

  • Sch

Dadurch können Sie Shell-Befehle innerhalb Ihrer Ruby-Dateien ausführen.

  • CD

Dies ist ein sehr grundlegender Befehl, aber dieser Befehl hat etwas Cooles. Wenn Sie angeben CD Mit einem Block ändert er das aktuelle Verzeichnis in sein Ziel, erledigt sein Geschäft wie im Block definiert und kehrt dann zum vorherigen Arbeitsverzeichnis zurück, um fortzufahren. Eigentlich ordentlich!

  • cp_r

Ermöglicht das rekursive Kopieren von Dateien und Verzeichnissen.

  • mkdir_p

Erstellt ein Zielverzeichnis und alle angegebenen übergeordneten Elemente. Zum Glück für uns haben wir die Verzeichnis Methode in Rake, was noch bequemer ist und deshalb brauchen wir sie nicht.

  • berühren

Dadurch wird der Zeitstempel einer Datei aktualisiert, sofern sie existiert. Andernfalls wird sie erstellt.

  • identisch?

Damit können Sie überprüfen, ob zwei Dateien gleich sind.

Verzeichnismethode

In Rake haben Sie eine praktische Möglichkeit, Verzeichnisse ohne Verwendung zu definieren mkdir oder mkdir_p. Dies ist besonders praktisch, wenn Sie verschachtelte Verzeichnisse erstellen müssen. Eine Ordnerstruktur kann sehr schmerzhaft sein, wenn Sie eine Verzeichnisstruktur über mehrere Datei-Tasks erstellen müssen, die viele Voraussetzungen für die Verzeichnisstruktur haben. Denken Sie an die Verzeichnis Methode als Ordneraufgabe.

Irgendein Rakefile

Verzeichnis 'mi6 / q / special_gadgets'

Dadurch werden die betreffenden Verzeichnisse ohne viel Aufwand erstellt. Was vielleicht nicht sofort offensichtlich ist, ist die Tatsache, dass Sie sich darauf wie jede andere Rechenaufgabe verlassen können - als Voraussetzung. Stellen Sie einfach sicher, dass der Name der Dateiaufgabe und deren Name das Verzeichnis enthält, von dem Sie abhängig sind. Wenn mehrere Aufgaben davon abhängen, wird es nur einmal erstellt.

Verzeichnis 'mi6 / q / gadgets' desc 'Übertragen von geheimen Forschungsgeräten' Datei 'mi6 / q / gadgets / gadget_list.md' => 'mi6 / q / gadgets' do cp 'gadget_list.md', 'mi6 / q / special_gadgets /secret_gadget_list.md 'end

Wie Sie hier sehen können, ist Rake sehr konsistent und überlegt, was als Aufgaben zu erstellen ist. Danke, Jim, das macht das Leben einfach!

Regeln

Regeln können uns helfen, Doppelarbeit zu reduzieren, wenn wir uns eigentlich mit Aufgaben-Tasks beschäftigen. Anstatt Rake anzuweisen, Aufgaben für bestimmte Dateien auszuführen, wie z somefile.markdown, Wir können Rake beibringen, diese Aufgaben auf einer bestimmten Art von Datei wie Muster oder Blaupause auszuführen. Das Umwandeln eines Satzes von Dateien anstelle von einzelnen Dateien ist viel vielseitiger und DRY. Aufgaben wie diese lassen sich viel besser skalieren, wenn wir ein Muster für Dateien definieren, die ähnliche Eigenschaften aufweisen.

Irgendein Rakefile

Datei "quartermaster_gadgets.html" => "quartermaster_gadgets.markdown" do sh "pandoc -s quartermaster_gadgets.markdown -o quartermaster_gadgets.html" ende

Wie Sie sehen können, wäre es langweilig, eine Reihe von Dateien zu haben. Ja, wir können unser eigenes Skript schreiben, in dem wir eine Liste von Dateien in einem Array führen und iterieren, aber wir können es besser machen - viel besser. 

Ein weiterer unerwünschter Nebeneffekt wäre, dass jedes Mal, wenn wir ein solches Skript ausführen, alle HTML-Dateien neu erstellt werden, selbst wenn sie sich überhaupt nicht geändert haben. Eine große Liste von Dateien würde dazu führen, dass Sie viel länger warten oder mehr Ressourcen als nötig beanspruchen. Wir benötigen keinen zusätzlichen Code, um sich um mehrere Dateien zu kümmern. Rake erledigt in dieser Abteilung eine bessere, effizientere Arbeit, da er seine Dateiaufgaben oder -regeln nur ausführt, wenn die Datei zwischenzeitlich berührt wurde.

Irgendein Rakefile

Regel ".html" => ".markdown" do | rule | sh "pandoc -s # rule.source -o # rule.name" end

Wenn wir eine Regel wie oben definieren, haben wir einen Mechanismus zum Transformieren von Dateien mit einem .Markdown Erweiterung in eine .html Datei. Mit Regeln sucht Rake zuerst nach einer Aufgabe für eine bestimmte Datei wie quartermaster_gadgets.html. Wenn es aber keinen findet, benutzt es die Ebene .html Regel, um nach einer Quelle zu suchen, die eine erfolgreiche Ausführung erreichen kann. Auf diese Weise müssen Sie keine lange Liste von Dateien erstellen, sondern verwenden nur eine allgemeine "Regel", die definiert, wie bestimmte Dateiaufgaben ausgeführt werden. Ziemlich cool!

Aufgabenobjekt

In der obigen Regel haben wir das Aufgabenobjekt verwendet - in diesem Fall ein Regelobjekt - um genauer zu sein. Wir können es als Blockargument in die Schließung übergeben und Methoden dazu aufrufen. Wie bei Datei-Tasks handelt es sich bei Regeln nur um Task-Quellen, ihre Abhängigkeiten, beispielsweise eine Markdown-Datei, und ihren Task-Namen. 

Aus dem Hauptteil der Regeln im Block (und den Datei-Tasks) heraus haben wir Zugriff auf den Namen und die Quelle der Regeln. Wir können Informationen aus diesem Argument extrahieren - den Namen durch regel.name und seine Quelle (aka Dateiquelle) via Regel.Quelle. Oben könnten wir vermeiden, die Namen der Dateien zu duplizieren und stattdessen ein Muster zu generalisieren. In ähnlicher Weise könnten wir die Liste der Voraussetzungen oder Abhängigkeiten mit abrufen regeln.voraussetzungen. Gleiches gilt natürlich für Datei- oder andere Aufgaben.

Wenn es um Abhängigkeiten geht, können sie wie eine zu iterierende Liste funktionieren. Es muss keine separate erstellt werden jeder Schleife, wenn Sie Ihre Karten richtig spielen. 

Aufgabe: html =>% W [quartermaster_gadgets.html, research_gadgets.html] Regel ".html" => ".md" do | r | sh "Pandoc -s # r.source -o # r.name" Ende

Wie Sie sehen, mussten wir die Artikelliste nicht manuell durchlaufen. Wir haben einfach Rake zum Laufen gebracht und die Abhängigkeiten genutzt - was viel einfacher und sauberer ist.

Noch cooler für DRYs ist, dass Regeln ein proc-Objekt - ein anonymes Funktionsobjekt, im Grunde ein Lambda - als Voraussetzung voraussetzen. Das bedeutet, dass wir anstelle eines einzigen Musters als Voraussetzung etwas Dynamischeres passieren können, das uns ermöglicht, ein Netz von Mustern zu werfen, die mehr als einen einzelnen Fisch fangen. Zum Beispiel Regeln für .Markdown und .md Dateien. 

Sie hätten den gleichen Regelkörper, aber nur ein anderes Muster als Voraussetzung. Es ist, als würde man für jedes vom proc-Objekt zurückgegebene Objekt einen neuen Datei-Task definieren. Eine andere Möglichkeit, mit Regeln zu arbeiten, sind natürlich reguläre Ausdrücke. Sie übergeben ein Muster als Abhängigkeit und wenn Sie eine Übereinstimmung gefunden haben, kann die Dateiaufgabe ausgeführt werden. Süße Optionen, nein?

some_markdown_list = […] detect_source = proc do | html_dateiname | some_markdown_list.detect | markdown_source | markdown_source.ext == html_dateiname.ext endregel '.html' => detect_source do | r | sh "Pandoc -s # r.source -o # r.name" Ende

Der Unterschied zwischen Procs und Lambdas

Wenn Sie noch kein Lambda-Land sind oder es noch nicht ganz verstanden haben, finden Sie hier eine kleine Auffrischung. Procs sind Objekte, die Sie weitergeben können, die später ausgeführt werden können, also Lambdas. Beides sind übrigens Proc-Objekte. Der Unterschied ist subtil und hängt von den Argumenten ab, die an sie weitergegeben werden. Lambdas überprüfen die Anzahl der Argumente und können mit einem explodieren ArgumentError Aus diesem Grund kümmern sich die Procs nicht. Der andere Unterschied besteht im Umgang mit Rückgabeanweisungen. Procs verlassen den Bereich, in dem das proc-Objekt ausgeführt wurde. Lambdas verlassen einfach den Lambda-Bereich und lösen sozusagen den nächsten Code aus. Nicht besonders wichtig hier, aber ich dachte für die Neulinge unter euch, es kann auch nicht schaden.

Nützliche Flaggen

Dies ist eine kurze Liste von Flags, die Sie an Rake-Tasks übergeben können.

  • --Regeln

Zeigt Ihnen, wie Rake versucht, Regeln anzuwenden - eine Ablaufverfolgung für Regeln. Unbezahlbar, wenn Sie mit ein paar Regeln umgehen und auf Fehler stoßen.

Schale

$ rake quartermaster_gadgets.html --rules Versuch der Regel quartermaster_gadgets.html => quartermaster_gadgets.md (quartermaster_gadgets.html => quartermaster_gadgets.md… EXIST) pandoc -s quartermaster_gadgets.md -o quartermaster_gadgets.html
  • -t

Erinnere dich an die lösen_bonnie_situation Aufgabe aus Artikel eins? Fügen Sie dieses Flag dieser Rake-Aufgabe hinzu und aktivieren Sie die Ablaufverfolgung. Wir erhalten auch eine Rückverfolgung, wenn wir auf Fehler stoßen. Dies ist sicherlich hilfreich für das Debugging.

Schale

$ rake browse_bonnie_situation -t ** Aufruf von solv_bonnie_situation (first_time) ** Aufruf von get_mr_wolf (first_time) ** Ausführen von get_mr_wolf Du hast kein Problem Jules, ich bin dabei! Gehen Sie dort hinein und entspannen Sie sich und warten Sie auf den Wolf, der direkt kommen sollte! ** Rufen Sie calm_down_jimmy (first_time) auf. ** Führen Sie calm_down_jimmy aus, Jimmy. Tun Sie mir einen Gefallen, oder? Ich habe dort hinten Kaffee gerochen. Würdest du mir eine Tasse machen? ** figure_out_bonnie_situation aufrufen (first_time) ** figure_out_bonnie_situation ausführen Wenn ich richtig informiert wurde, tickt die Uhr. Ist das richtig, Jimmy? ** Aufruf von get_vince_vega_in_line (first_time) ** Ausführen von get_vince_vega_in_line Wiederholen? Holen Sie sich gerade Buster. Ich bin nicht hier, um zu sagen, bitte! Ich bin hier, um dir zu sagen, was zu tun ist! ** Clean_car aufrufen (first_time) ** clean_car ausführen Ich brauche zwei Kerle, um diese Reinigungsprodukte zu nehmen und das Innere des Autos zu reinigen. Ich spreche schnell, schnell, schnell! ** Rufe clean_crew (first_time) auf ** Führe clean_crew aus, Jim, die Seife! OK. Meine Herren, Sie waren beide schon in der Grafschaft, bevor ich sicher bin. Hier kommt es! ** Aufruf von get_rid_of_evidence_at_monster_joes (first_time) ** Ausführen von get_rid_of_evidence_at_monster_joes Also, was ist mit den Outfits? Ihr geht zu einem Volleyballspiel oder so? ** Drive_into_the_sunrise (first_time) aufrufen ** Drive_into_the_sunrise ausführen. Ruf mich Winston an! ** Ausführen von solution_bonnie_situation Weißt du, ich würde zum Frühstück gehen. Lust auf ein Frühstück mit mir??

Ablaufverfolgungsregeln

Rahmen Rake.application.options.trace_rules = true In einem Rakefile selbst sagt Rake, dass wir Trace-Informationen zu Regeln anzeigen sollen, wenn wir eine Aufgabe ausführen. Das ist cool, wenn wir eine Spur via laufen lassen Rechen -t, Mit einem einzigen Flag erhalten wir alle Debugging-Informationen, die wir benötigen. Wir erhalten nicht nur eine Liste von Aufgabenaufrufen, sondern können auch sehen, welche Regeln angewendet wurden bzw. versucht wurden.

  • -P

Zeigt eine Liste der Voraussetzungen für alle Aufgaben an. Hier benutzen wir wieder die lösen_bonnie_situation Aufgabe. Wenn Sie die Ausgabe für andere Aufgaben auslassen, wäre dies eine eindeutige Ausgabe:

Schale

$ rake destroy_bonnie_situation -P… rake solution_bonnie_situation get_mr_wolf calm_down_jimmy figure_out_bonnie_situation get_vince_vega_in_line clean_car clean_crew get_rid_of_evidence_at_monster_joes drive_into_the_sunrise… 

Wenn Sie neugierig sind, rennen Sie Rechen -P. Ziemlich interessante Ausgabe.

  • -m

Führt Aufgaben als Multitasks aus.

Parallele Aufgaben

Darf ich Sie kurz vorstellen? Multitask Methode. Dies kann Ihnen helfen, die Dinge ein bisschen zu beschleunigen, schließlich haben wir auf den meisten modernen Computern mehrere Kerne, also nutzen wir sie. Natürlich können Sie die Geschwindigkeitssteigerungen immer erreichen, indem Sie soliden Code schreiben, dem es an Fett fehlt, aber das parallele Ausführen von Aufgaben kann Ihnen sicherlich etwas Besonderes geben. Es gibt jedoch Fallstricke, die wir auch behandeln werden.

Bei den bisher ausgeführten Aufgaben werden alle Aufgaben nacheinander ausgeführt. Es ist eine sichere Sache, wenn Ihr Code in Ordnung ist, aber er ist auch langsamer. Wenn Geschwindigkeit für einige Aufgaben wichtig ist, können wir durch Multi-Threading-Aufgaben ein wenig helfen. Beachten Sie jedoch, dass der sequentielle Ansatz unter bestimmten Umständen die bessere Option ist.

Nehmen wir an, wir haben drei Rake-Tasks, die als Voraussetzung ausgeführt werden müssen, um einen vierten auszuführen. Dies sind im Grunde vier Fäden. Im Großen und Ganzen ist, wenn Sie mehrere Anwendungen gleichzeitig ausführen, genauer gesagt, Prozesse, dieselbe Idee am Werk.

multitask: shoot_bond_movie => [: shoot_car_chase,: shoot_love_scene,: shoot_final_confrontation] do put "Hauptfotografie ist fertig und wir können mit dem Bearbeiten beginnen." Ende

Verwenden Multitask, Die Abhängigkeiten in unserem Voraussetzungs-Array werden jetzt nicht mehr in dieser Reihenfolge ausgeführt. Stattdessen werden sie verteilt und parallel ausgeführt, jedoch vor dem shoot_bond_movie Aufgabe natürlich. Ein Ruby-Thread für jede Aufgabe wird gleichzeitig ausgeführt. Sobald sie fertig sind, shoot_bond_movie wird sein Geschäft machen. Die Art und Weise, wie sich Aufgaben hier verhalten, ähnelt der Randomisierung, wird jedoch einfach gleichzeitig ausgeführt.

Der schwierige Teil besteht nur darin, sicherzustellen, dass bestimmte Abhängigkeiten in einer Reihenfolge verarbeitet werden, die Ihren Anforderungen entspricht. Aus diesem Grund müssen wir uns um die Rennbedingungen kümmern. Dies bedeutet im Wesentlichen, dass einige Aufgaben auf Probleme stoßen, weil die Reihenfolge der Ausführung ungewollte Nebenwirkungen hatte. Es ist ein Fehler. 

Wenn wir das vermeiden können, erreichen wir Gewindesicherheit. In Bezug auf die allgemeinen Voraussetzungen werden diese Voraussetzungen interessanterweise nur einmal ausgeführt, da die Multitask-Voraussetzungen erst auf ihre Fertigstellung warten.

task: shoot_love_scene do… beenden task: prepar_italy_set do… beenden task: shoot_car_chase => [: prepar_italy_set] do… beenden task: shoot_final_confrontation => [: prepar_italy_set] do… beenden multitask: shoot_bond_movie => [: shoot_car_chase,: ] do put "Hauptfotografie ist fertig und wir können mit dem Bearbeiten beginnen." Ende

Beide shoot_car_chase und shoot_final_confrontation Aufgaben hängen davon ab prepare_italy_set Zuerst zu Ende, was übrigens nur einmal ausgeführt wird. Wir können diesen Mechanismus verwenden, um die Reihenfolge vorherzusagen, wenn Aufgaben parallel ausgeführt werden. Vertrauen Sie nicht einfach der Reihenfolge der Ausführung, wenn dies für Ihre Aufgabe wichtig ist.

Abschließende Gedanken

Nun, ich schätze, Sie sind jetzt gut gerüstet, um ernsthafte Rake-Geschäfte zu schreiben. Wenn Sie dieses Tool richtig einsetzen, wird Ihr Leben als Ruby-Entwickler hoffentlich noch mehr Spaß machen. In diesem zweiten Artikel hoffe ich, dass ich Ihnen vermitteln kann, was für ein einfaches, aber wunderbares Werkzeug Rake wirklich ist. Es wurde von einem wahren Meister seines Handwerks geschaffen.  

Wir alle haben Jim Weirich großen Respekt dafür verdankt, dass er dieses elegante Bauwerkzeug entwickelt hat. Die Ruby-Community ist sicherlich nicht mehr dasselbe, seit er gestorben ist. Jims Vermächtnis ist jedoch eindeutig hier zu bleiben. Ein weiterer Riese, auf den wir bauen dürfen.