Rechen 301

In diesem letzten Artikel werden FileList, Pathmap, CLEAN, CLOBBER und übergebene Argumente behandelt. Diese sind für Anfänger zwar nicht besonders wichtig, werden sich aber später wirklich als sehr nützlich erweisen.

Themen

  • Argumente übergeben
  • Dateiliste
  • Pathmap
  • Clean & Clobber
  • Für die Straße

Argumente übergeben

Sie haben zwei Möglichkeiten, Argumente in Rake-Aufgaben zu übergeben. Sie können dies entweder mit Bash-Variablen oder mit der Rake-Syntax selbst tun.

ENV Variable

Falls Sie noch nicht mit Bash gespielt haben - oder Bash klingt für Sie wie Gobbledeg -, nehmen wir fünf und beginnen Sie von vorne. 

Bash in Ihrer Shell bietet zwei Arten von Variablen: globale Variablen (auch Umgebungsvariablen genannt) und lokale. Beide sind in Großbuchstaben geschrieben. Die Umgebungsvariablen sind globale, das heißt, sie sind in allen Shells verfügbar und verschwinden nicht, wenn Sie eine Variable schließen, im Gegensatz zu lokalen Bash-Variablen, die nur in der aktuellen Shell verfügbar sind. 

Umgebungsvariablen können Daten enthalten, die von mehreren Anwendungen verwendet werden können. Sie werden häufig als praktische Methode zur gemeinsamen Nutzung von Konfigurationseinstellungen verwendet. Im Gegensatz dazu sind lokale Bash-Variablen nur lokal. 

Im Rahmen der Verwendung von Rake haben Sie die Möglichkeit, sowohl über Ruby als auch tatsächlich über die Befehlszeile Variablen zu übergeben.

Zu Ihrer Information

Nur ein bisschen beiseite, wenn Sie tippen env oder ENV In Ihrer Shell erhalten Sie Zugriff auf eine Reihe von Umgebungsvariablen. Ich habe die Liste überarbeitet, aber für ein besseres Verständnis der Umgebungsvariablen und ihrer Bestandteile ermutige ich Sie, sie für sich selbst auszuführen.

Schale

env

Ausgabe

TERM_PROGRAM = Apple_Terminal TERM = screen-256color SHELL = / bin / bash TMUX = / private / var / Ordner / 4z / 3np9k5ks62b1xpbn_w_lmrgh0000gr / T / tmux-504 / default, 4146,0 EDITOR = v_L. % 1 is_vim = echo "# pane_current_command" | grep -iqE "(^ | \ /) g? (view | n? vim? x?) (diff)? $"… 

Wenn Sie eine Liste der lokalen Bash-Variablen anzeigen möchten, können Sie sie ausführen einstellen.

Schale

(set -o posix; set) | Weniger

Das einstellen Befehl gibt Ihnen viel mehr Ausgabe, aber das Obige zeigt Ihnen sofort die relevanten Bits.

Rubys ENV-Klassenmethode

Ruby bietet die Möglichkeit, Umgebungen und lokale Bash-Variablen über einen Hash-ähnlichen Accessor gleichermaßen zu verwenden. Wenn wir eine Variable an eine Rake-Task übergeben, handelt es sich für unsere Bedürfnisse um eine lokale Bash-Variable, die Sie in der Liste der laufenden Variablen finden einstellen oder eine Variation davon. Ruby kann es mit auslesen ENV ['VARIABLE'].

Schale

rake prepar_book BOOKTITLE = "Geständnisse eines Einhorns"

Was ich jedoch klarstellen möchte, ist, dass diese Variable nicht zur ENV-Liste hinzugefügt wird, die Ihr System verwendet env aus der Schale. Um es zu dieser Liste hinzuzufügen, müssen Sie es "exportieren". Dies ist eine andere Geschichte, aber ich dachte, ich sollte das klarstellen.

Irgendein Rakefile

Aufgabe: prepar_book do book_title = ENV ['BOOKTITLE'] || "Arbeitstitel" setzt "Ende mit dem # book_title"

In dieser Aufgabendefinition können Sie sehen, wie wir bereit waren, die an den Aufgabenaufruf übergebene Variable zu akzeptieren oder zu integrieren. Ruby ENV [BASHVARIABLE] macht all das schwere anheben. Ob BUCHTITEL Obwohl dies eine globale Umgebungsvariable gewesen wäre, hätten wir auch mit dieser Syntax auf diese Taskdefinition zugreifen können.

Rechenparameter-Syntax

Der zweite Ansatz verwendet die reine Rake-Syntax. Sie übergeben Variablen einfach in eckige Klammern. Dieser Ansatz ist besser und Sie können die Dinge isolierter halten. Warum sollte Bash mit einbezogen werden, wenn Rake dies perfekt beherrscht? Außerdem gibt es keine Bash-Variablen, die auf diesem Weg schweben. Wenn Sie mehrere Argumente in eine Aufgabe übergeben möchten, ist dies ebenfalls viel eleganter.

Schale

Rechen "create_mi6_agent [James, Bond, 007]"

Irgendein Rakefile

Aufgabe: create_mi6_agent, [: Vorname,: Nachname,: Nummer] do | t, args | setzt "Nummer # args.number ist Kommandant # args.first_name # args.last_name." Ende

Wenn Sie mehr Argumente übergeben, als Sie in Ihrer Aufgabe definiert haben, können Sie einfach über diese auf sie zugreifen args. args.extras Zeigt ein Array aller zusätzlich eingegebenen Parameter an. args.to_a zeigt Ihnen natürlich auch alle Parameter in einem Array.

Dateiliste

In den vorangegangenen Beispielen haben wir manuell Listen von Dateien gesammelt, die eine Umwandlung benötigen. Das ist langweilig, richtig? Dateiliste ist eine der Feinheiten, die Rake zu einem mächtigen Werkzeug macht. Es ist einfach zu einfach, ein Glob-Muster für die Dateien zu definieren, die Sie benötigen, und es muss automatisch auf dem neuesten Stand sein, wenn Sie Dateien an diesem Ziel hinzufügen oder daraus löschen. Damit können Filterlisten so einfach oder so ausgefeilt sein, wie wir es brauchen. Reguläre Ausdrücke sind nur die Spitze des Eisbergs - wenn auch sehr praktisch.

Die Erstellung von Listen mit Dateien ist für Build-Tools sehr üblich. Die einfache Handhabung von Dateien ist eine der Stärken von Rake. FileList macht Ihr Rakefile kleiner, intelligenter und kann eine beliebige Anzahl von Dateien verarbeiten, die Sie nicht verwalten müssen. Sie können Rake verantwortlich lassen. 

Was genau ist eine FileList? Stellen Sie sich dies als ein Array von Dateien vor, die dem angegebenen Muster entsprechen. Es ist ein spezielles Ruby-Array, das sich auf die Verarbeitung von Listen von Dateien konzentriert und diese als Zeichenketten speichert. Einmal abgeholt, sind sie bereit für Sie, um zu iterieren und Transformationen anzuwenden.

Irgendein Rakefile

image_list = Dateiliste ['images / *. png'] => ["images / jim-weirich.png", "images / zen-rake.png"]

Die manuelle Verwaltung dieser Dateien ist eine sichere Methode, um auf Sand aufzubauen. Und natürlich überprüft Rake die Zeitstempel dieser Liste und erstellt nur veraltete Dateien neu. Eine FileList ist auch faul. Dateien werden erst abgerufen, wenn sie benötigt werden. Wenn Sie eine Reihe von Dateilisten haben, verhalten sie sich deshalb sehr vernünftig und klug. Die Listen, die nicht aktiv genutzt werden, nehmen es leicht, ohne das Dateisystem zu treffen. Auf diese Weise ist es effizienter.

Wie Sie unten sehen können, können Sie auch mehrere Glob-Muster für die Liste angeben.

Irgendein Rakefile

image_list = Dateiliste ['images / *. png', 'images / *. jpg'] => ["images / happy-jim.jpg", "images / jim-weirich.png", "images / zen-rake". png "]

Bei großen Dateisätzen sind Ausschlüsse sehr praktisch, z. B. wenn Sie temporäre Dateien, Sicherungsdateien aus Editoren, Git-Dateien oder bestimmte nicht benötigte Verzeichnisse herausfiltern möchten. Kurz gesagt, gelten Ausschlussregeln für Dateien, die Sie in Ihrem Build nicht möchten.

articles = Rake :: FileList.new ('_ posts / ** / *. markdown, md') do | files | files.exclude ('/ _ posts / drafts / *. markdown, md') end => ["_posts / veröffentlicht / 2016 / 2016-02-02-some-article.md", "_posts / veröffentlicht / 2015 / 2015-12-12-another-article.markdown "] 

Wir können die Dateien der Dateiliste über ihren Initialisierer übergeben, der eine Liste von Dateimasken akzeptiert. Sie verarbeiten alle Ausschlüsse innerhalb des Blocks. Wir haben die Liste der gewünschten Dateierweiterungen über vereinfacht markdown, md Dinge trocken halten. Sie können diese Ausschlüsse auch so lange verketten, wie Sie benötigen. Hier können wir sogar bequem überprüfen, ob die in der Dateiliste enthaltenen Dateien leer sind (Null?) und diese auf diese Weise aus dem Array ausschließen.

articles = Rake :: FileList.new ('_ posts / ** / *. md') do | files | files.exclude ('/ _ posts / drafts / *. markdown, md') files.exclude ('_ posts / ~ *') files.exclude do | file | File.zero?(file) end end

Grundsätzlich bieten wir mehrere Glob-Muster an, um nur die Dateien zu sammeln, die wir in der Dateiliste benötigen. Aus irgendeinem Grund können Sie auch den umgekehrten Weg gehen und Dateien in eine Dateiliste aufnehmen.

FL = Dateiliste ['images / *. Png'] FL.include ('images / private / *. Jpg)

Pathmap

Es ist die Geheimwaffe von Rake und zeigt seine wahre Stärke, indem Sie Dateipfade bearbeiten können. Es kann sowohl über FileList als auch über einzelne Dateien auf einer Liste von Dateien aufgerufen werden. Vergiss nicht, dass es auf Saiten funktioniert. Es ist Teil einer Erweiterung von Ruby String Klasse.

Spielen wir mit einer einfachen Datei und ändern Sie eine einfache Erweiterung. Wir könnten das mit dem Handy machen ext Methode natürlich.

Einige Ruby-Datei

"/mi6/q/secret_gadgets.xml".ext("html") # => '/mi6/q/secret_gadgets.html'

Das ext Mit method können wir eine Dateierweiterung ziemlich leicht ersetzen. Mal sehen, was wir mit dieser Datei machen können, wenn wir herumspielen Pfadzuordnung, obwohl. Ich denke, das ist der beste Weg, um Ihnen zu zeigen, was es für Sie bereithält. Das können wir auch so erreichen.

Irgendein Rakefile

"/mi6/q/secret_gadgets.xml".pathmap('%X.html ') # =>' /mi6/q/secret_gadgets.html '

Wie Sie sehen, ist dies etwas eleganter. Wir bieten an Pfadzuordnung mit einer Angabe, was wir von diesem String über brauchen %.

  • % X

Damit erhalten wir alles außer der Dateierweiterung. Dann fügen wir einfach die Erweiterung hinzu, die wir brauchen. Dies kratzt aber nur an der Oberfläche. Pfadzuordnung hat viele nützliche Marker, mit denen Sie kreativer sein können. Dateipfadmanipulationen könnten damit nicht einfacher sein. 

  • % p

Wenn Sie den vollständigen Pfad benötigen.

"/mi6/q/secret_gadgets.xml".pathmap('%p ') # =>" mi6 / q / secret_gadgets.xml "
  • % f

Wenn Sie nur den Namen eines bestimmten Pfads benötigen. Keine Verzeichnisse mit der Dateierweiterung.

"/mi6/q/secret_gadgets.xml".pathmap('%f ') # =>" secret_gadgets.xml "
  • % n

Wenn Sie den Dateinamen eines bestimmten Pfads ohne die Dateierweiterung benötigen.

"/mi6/q/secret_gadgets.xml".pathmap('%n ') # =>" secret_gadgets "
  • % d

Wenn Sie nur die Liste der Verzeichnisse eines bestimmten Pfads benötigen.

"/mi6/q/secret_gadgets.xml".pathmap('%d ') # =>" mi6 / q "
  • % x

Extrahiert nur die Dateierweiterung.

"/mi6/q/secret_gadgets.xml".pathmap('%x ') # =>" .xml "
  • % s

Zeigt nur das Dateiseparator an.

"/mi6/q/secret_gadgets.xml".pathmap('%% ') # =>" / "
  • % nd

Wenn Sie eine bestimmte Anzahl von Verzeichnissen angeben möchten, die Sie benötigen. Praktisch für tief verschachtelte Dateistrukturen.

"/mi6/q/secret_gadgets.xml".pathmap('%1d ') # =>" mi6 "
"/mi6/q/secret_gadgets.xml".pathmap('%2d ') # =>" mi6 / q "

Sie können sich auch in umgekehrter Reihenfolge mit einem Minus nähern.

"/mi6/q/secret_gadgets.xml".pathmap('%-2d ') # =>" mi6 / q "
"/mi6/q/secret_gadgets.xml".pathmap('%-1d ') # =>" q "

Wie Sie sehen, geht diese kleine Methode auf alle Anforderungen ein, die Sie haben können, wenn Sie eine Liste von Dateien einer anderen Liste von Dateien zuordnen. Befestigen Sie es an eine FileList und der Zauber tritt ein. Es ist wirklich ein Werkzeug zum Munging von Dateinamen.

images = Dateiliste ['images / *. png'] thumbs = images.pathmap ('thumbs /% n-thumbs% x')

Hier nehmen wir zum Beispiel eine Liste von Bildern und ordnen sie neuen Dateinamen zu, indem wir die Dateinamen extrahieren und eine hinzufügen -Daumen Suffix plus die extrahierte Dateierweiterung beim Einfügen in eine Daumen Verzeichnis. Ich bin mir sicher, dass Sie dafür eine sehr gute Verwendung finden werden Pfadzuordnung.

Clean & Clobber

Wir möchten, dass ein Projekt in einen ursprünglichen Zustand versetzt wird. Eine Dateiliste eignet sich nicht nur für das Vorbereiten von Dateien, die transformiert werden sollen, sondern erleichtert auch das Sammeln von Dateien, die Sie bereinigen möchten, nachdem Sie Ihre Aufgaben erledigt haben. CLEAN und CLOBBER sind eigentlich auch FileLists. Sie haben nur zwei sehr spezifische Jobs, die Löschung erledigen müssen.

Irgendein Rakefile

erfordern 'rake / clean' CLEAN.include ('*. intermediate_files') CLOBBER.include ('*. intermediate_files', 'built_files / *')

Diese beiden Aufgaben sind natürlich dumm, und Sie müssen ihnen Dateilisten über unser Handy zuführen umfassen. Wenn du rennst Rechen sauber oder Rechen clobber, Diese gesammelten Dateien werden verschwinden. Da es sich hierbei um ein optionales Modul handelt, müssen Sie es zuerst in Ihrem Rakefile anfordern. Das Schöne an CLEAN und CLOBBER ist, dass Sie hier einen zentralen Ort für die Reinigung Ihrer Build-Dateien finden. Sicher, Sie könnten Rake-Aufgaben manuell schreiben, um dies zu handhaben, aber sowohl CLEAN als auch CLOBBER lösen es für Sie, ohne das Rad neu zu erfinden.

Wir stellen nicht alles in eine saubere Aufgabe, da es praktisch ist, zwischen Zwischen- und Build-Dateien zu unterscheiden. Angenommen, wir mussten HTML-Dateien erstellen, um endgültige PDF-Versionen unserer Markdown-Dateien zu erstellen. Wir würden die HTML-Dateien in unsere einfügen SAUBER Liste. Beide .html und das Finale .pdf Dateien würden in gehen KLAMOTTEN. Konzeptionell soll die CLOBBER-Liste alles in beiden Listen entfernen.

Warum interessieren uns diese Build-Dateien? Manchmal möchten Sie alles neu erstellen und alte Dateien löschen, um einen brandneuen Build zu erhalten. Daher benötigen Sie eine Möglichkeit, alle Dateien zu löschen, die generiert wurden, während die Quelldateien beibehalten werden, die für die am häufigsten verwendeten Dateien benötigt werden, die der Versionskontrolle unterliegen. Es ist einfach für diese Listen, sich zu veralten, wenn Sie das Problem manuell lösen. Wenn Sie sie wie unsere gute alte Freundin FileList behandeln, wird dieser Prozess daher wesentlich effektiver.

Für die Straße

  • Komponenten 

Rake ist im Wesentlichen für das Verwalten von Aufgaben gedacht. Unterteilen Sie sie in die nützlichsten Bestandteile und bauen Sie sie auf, um größere Aufgaben zu erstellen. Denken Sie an OOP! Gleiches gilt für Ihre Dateien. Rails macht dies sehr einfach über Aufgaben / lib. In anderen Projekten können Sie ein Verzeichnis mit dem Namen erstellen Rakelib und bauen Sie Ihre Rake-Komponenten dort. Rake lädt das Rakefile und Rakelib / *. Rechen Dateien automatisch.

  • Verwenden Rechen - Trockenlauf

Wenn Sie eine Aufgabe ausführen müssen, die in gewisser Weise möglicherweise zerstörerisch ist, und Sie zuerst prüfen möchten, was diese Aufgabe tun würde, können Sie die Aufgabe in einer Sandbox sortieren. Sie sehen das Protokoll dessen, was ohne die Dateivorgänge gemacht wird.

  • KUSS

Halte es einfach! Bei Rake geht es darum, möglichst wenig zu tun. So solltest du sein. Das Schöne an Rake ist, dass es eine großartige DSL-Verbindung bietet, ohne dass Sie viel Seil haben, um sich selbst zu beschädigen, indem Sie das Rad unnötig neu erfinden.

  • Namensräume

Namespaces sind billig und verhindern, dass Sie auf Konfliktnamen stoßen. Dies ist besonders wichtig, wenn Sie Rakefiles haben, die aus verschiedenen Quellen stammen und von mehreren Entwicklern stammen.

Aufgabe: fight_bad_dude do… Ende Namespace: bond do Aufgabe: fight_bad_dude… Ende Ende
  • Dateimanipulationen

Nutzen Sie FileUtils und vermeiden Sie die Bearbeitung von Shell-Dateien innerhalb Ihrer Aufgaben. Es ist ein bisschen schmutzig, wenn Rake sie Ihnen bereits direkt zur Verfügung stellt.

  • Ruby-Befehle

Sie können Ruby-Dateien in Rake-Dateien ausführen. Das kann von Zeit zu Zeit nützlich sein.

Aufgabe: some_task erledigt das Rubin-Ende von 'ruby_program.rb'
  • Dynamisch erzeugte Aufgaben

Verwenden Sie Regeln, wenn Sie viele Dateien anstelle von dynamisch generierten Aufgaben haben. Warum? Lauf Rechen -P und Sie erhalten alle eine Liste. Das kann sehr schnell aus dem Ruder laufen. Abgesehen von der Regellosigkeit fehlt es oft einfach an Eleganz. Sie haben das Muster möglicherweise noch nicht auf den Kern reduziert. Am wichtigsten ist, dass dies die Wiederverwendung erleichtert, während es natürlich trocken ist.

  • Listen

Anstatt Sammlungen für Dateien selbst zu definieren - und auch diese Liste zu aktualisieren - lassen wir lieber Rake die Verantwortung dafür übernehmen. Wie wir gesehen haben, ist das Sammeln von Dateien für Ihre Aufgaben in Rake überhaupt nicht kompliziert. 

  • Rubin

Verwenden Sie Ruby-Methoden für komplexere Aufgaben. Extrahieren Sie Methoden zur Wiederverwendung, wo immer Sie können. Nur weil wir Code in Rake-Dateien schreiben, sollte dies nicht die korrekte Kapselung und OOP verhindern.

  • Aufgaben suchen

Schale

Rechen-secret_service_agent

So wird beispielsweise nach Rake-Aufgaben mit "secret_service_agent" gesucht. Sie stimmt mit dem Aufgabennamen überein, jedoch nicht mit der Beschreibung.

Rechen -W create_mi6_agent

Das zeigt uns wo die Aufgabe liegt create_mi6_agent ist definiert.

Abschließende Gedanken

Rake ist eine leistungsstarke Task-Management- und Ausführungs-Engine. Open-Source-Software vom Feinsten, wenn Sie mich fragen. Zuerst war ich wirklich überrascht, wie viele Downloads es in den letzten Jahren angehäuft hat. Dass dieses kleine Build-Tool das bisher beliebteste Juwel ist und über 100 Millionen Downloads hat, erscheint verrückt. 

Wenn Sie jedoch einen tieferen Blick darauf werfen, was es zu bieten hat, wird im Handumdrehen klar, was ein Master-Software-Autor Jim Weirich wirklich war - ein echter Ruby-Held, den wir alle für seine Arbeit, sein Erbe und seine Leidenschaft bewundern sollten. Ich lasse Sie mit einem netten Video-Interview, in dem Jim über Rake spricht. Es gibt Tonnen von anderen Videos seiner Gespräche online. Gehen Sie alle auf!