Was sind die best-practices für die Umsetzung ist ein CLI-tool, das in Perl?
Ich bin Implementierung eines CLI-Tools mit Hilfe von Perl.
Was sind die best-practices können wir hier Folgen?
- Irgendwelche Hinweise, zu lernen über das schreiben von CLI-tools in Perl oder in einer anderen Sprache ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Vorwort, ich habe 3 Jahre engineering und die Implementierung einer ziemlich komplizierten Kommandozeilen-Tools in Perl für eine große Finanz-Unternehmen. Die Ideen unten sind quasi ein Teil von unserem team-design-Richtlinien.
Benutzeroberfläche
Kommandozeilen-option: ermöglichen Sie so viele wie möglich haben default-Werte.
KEINE positions-Parametern für einen Befehl mit mehr als 2 Optionen.
Haben lesbaren Optionen Namen. Wenn die Länge der Kommandozeile ist ein Anliegen für nicht interaktive Aufruf (z.B. einige un-named legacy-Oberteile haben kurze Grenzen, die auf Kommando-Zeilen), bieten kurze alias - GetOpt::Long ermöglicht es, dass einfach.
Zumindest, drucken Sie alle Optionen' Standard-Werte '-help' angezeigt wird.
Besser noch, drucken Sie alle Optionen " "aktuelle Werte" (z.B. wenn ein parameter und ein Wert geliefert werden, zusammen mit "-Hilfe", die Hilfe-Nachricht gedruckt wird parameter s-Wert von der Kommandozeile). So können die Menschen versammeln Befehlszeilen-Zeichenfolge für die komplizierten Befehl, und bestätigen Sie es durch Anhängen von "-Hilfe", bevor Sie tatsächlich ausgeführt wird.
Folgen Unix-standard-Konvention zu verlassen mit return-code ungleich null, wenn das Programm beendet mit Fehler.
Wenn Ihr Programm produzieren nützlich (z.B. Wert-capturing/grepping/whatnot) Ausgabe, stellen Sie sicher, dass alle Fehler/Diagnose-Meldungen gehen an STDERR, so dass Sie leicht trennbar.
Ideal, dem Benutzer zu ermöglichen, geben Sie input/output-Dateien über Kommandozeilen-parameter, stattdessen zwingen "<" /">" leitet - dies ermöglicht VIEL einfacher das Leben für Menschen, die komplizierte Rohre mit deinem Befehl. Das gleiche gilt für Fehlermeldungen - habe logfile-option.
Wenn ein Befehl hat den Nebeneffekt, dass ein "whatif/no_post" - option ist in der Regel eine Sehr Gute Idee.
Umsetzung
Wie bereits erwähnt, nicht das Rad neu zu erfinden. Verwenden Sie standard-command-line-parameter-handling-Module - MooseX::Getopt, oder Getopt::Long
Für Getopt::Long, weisen alle Parameter, um einen einzigen hash im Gegensatz zu den einzelnen Variablen. Viele nützliche Muster sind vorbei, dass CLI args hash-Objekt-Konstruktoren.
Sicherstellen, dass Ihre Fehlermeldungen sind klar und informativ... E. g. include "$!" in jedem IO-Verwandte Fehlermeldungen. Es lohnt sich zu verausgaben extra 1 minute und 2 Zeilen in Ihrem code eine eigene "Datei nicht gefunden" vs. "Datei nicht lesbar" - Fehler, im Gegensatz zu verbringen 30 Minuten in der Produktion Dringlichkeit, weil eine nicht lesbare Datei Fehler wurde falsch diagnostiziert, indem Sie die Produktion Operationen, die als "No input file" - dies ist ein Beispiel aus der Praxis.
Nicht wirklich CLI-spezifisch, aber überprüfen Sie alle Parameter im Idealfall direkt nach dem erhalten Sie.
CLI-nicht für ein "front-end" Validierung webapps tun, so super besonders aufmerksam sein.
Werden, wie oben diskutiert, Modularisieren business-Logik. Unter anderen Gründen bereits aufgeführt, ist die Höhe der Zeit, die ich hatte, zu re-implementieren einer vorhandenen CLI-tool als web-app ist gewaltig - und nicht, dass schwierig, wenn die Logik ist schon ein richtig perm Modul.
Interessante links
CLI-Design-Muster - ich denke, das ist die ESR ist
Ich werde versuchen, fügen Sie mehr Kugeln, wenn ich mich Recht erinnere.
POD verwenden, um Ihr Dokument-tool, befolgen Sie die Richtlinien der man-pages; mindestens aus folgenden Abschnitten: NAME, SYNOPSIS, DESCRIPTION, AUTOR. Sobald Sie die richtige POD erzeugen Sie die man-Seite mit pod2man, Lesen Sie die Dokumentation auf der Konsole mit perldoc your-script.pl.
Verwenden ein Modul, mit der Befehlszeilen-Optionen für Sie. Ich mag es wirklich, mit Getopt::Long in Verbindung mit Pod::Usage diese Weise aufrufen --help zeigt eine schöne Meldung.
Stellen Sie sicher, dass Ihre Skripte gibt eine richtige Ausfahrt Wert, wenn es erfolgreich war oder nicht.
Hier ist ein kleines Skelett von einem Skript, das alle diese:
main
Unterprogramm wird Ihnen nicht helfen, es wird nur die Tatsache verbergen, dass der code falsch ist.Einige Lektionen, die ich gelernt habe:
1) verwenden Sie Stets Getopt::Long
2) helfen, die auf der Nutzung via --help, idealerweise mit Beispielen von gemeinsamen Szenarien. Es hilft den Menschen nicht kennen oder vergessen haben, wie das tool zu verwenden. (I. e., Sie in sechs Monaten).
3), es sei denn, es ist ziemlich offensichtlich, an den Benutzer, wie, warum, dann nicht für lange Zeit (>5s) ohne Ausgabe an den Benutzer. So etwas wie " print "Zeile $Zeile...\n" unless ($Zeile % 1000)' geht ein langer Weg.
4) Für lang laufende Operationen, die dem Benutzer erlauben, sich zu erholen, wenn möglich. Es saugt wirklich durch zu bekommen 500k von einer million, zu sterben, und wieder von vorne anfangen.
5) Trennen Sie die Logik von dem, was du tust in Module und verlassen Sie die eigentlichen .pl-Skript als barebones wie möglich; parsing-Optionen, Anzeige-Hilfe, aufrufen der grundlegenden Methoden, etc. Sie sind unvermeidlich, um etwas zu finden, das Sie wiederverwenden möchten, und dies macht es verdammt viel einfacher.
Den wichtigsten Sache ist standard-Optionen.
Versuchen Sie nicht, clever zu sein, einfach im Einklang mit bereits vorhandenen tools.
Wie um dies zu erreichen ist auch wichtig, aber kommt nur zweiten.
Eigentlich ist dies ziemlich generisch für alle CLI-Schnittstellen.
Gibt es ein paar Module auf CPAN zu machen, dass schreiben CLI-Programme viel einfacher:
Wenn Sie app ist der Elch auch einen Blick auf MooseX::Getopt und MooseX::Runnable
Die folgenden Punkte sind nicht spezifisch für Perl, aber ich habe gefunden, dass viele Perl-CL-Skripte auf einen Mangel in diesen Bereichen:
Gängigen Kommandozeilen-Optionen. Zeigen Sie die Versionsnummer implementieren -v oder --version nicht --ver. Für rekursive Verarbeitung -r (oder-vielleicht -R, obwohl in meinem Gnu/Linux-Erfahrung -r ist häufiger) nicht-rec. Die Menschen mit Ihrem Skript, wenn Sie sich erinnern können die Parameter. Es ist leicht zu lernen einen neuen Befehl, wenn Sie sich erinnern können "es funktioniert wie grep" oder eine andere vertraute-Dienstprogramm.
Viele Kommandozeilen-tools Prozess "Dinge" (Dateien oder Verzeichnisse) innerhalb der "aktuellen Verzeichnis". Während dies kann praktisch sein, stellen Sie sicher, dass Sie auch hinzufügen, Kommandozeilen-Optionen explizit für die Identifizierung der Dateien oder Verzeichnisse zu verarbeiten. Dies macht es einfacher, um Ihre Nützlichkeit in eine pipeline ohne die Entwickler haben für die Ausgabe einer Reihe von cd-Befehlen und erinnern Sie sich, in welchem Verzeichnis Sie sich befinden.
Sollten Sie verwenden Perl-Module zu machen den code wiederverwendbar und leicht zu verstehen.
sollten Sie einen Blick auf Perl best practices