Laden...

CommandLineParser - Ein leichtgewichtiger Befehlszeilen-Parser

Erstellt von Repac3r vor 9 Jahren Letzter Beitrag vor 9 Jahren 7.866 Views
R
Repac3r Themenstarter:in
57 Beiträge seit 2014
vor 9 Jahren
CommandLineParser - Ein leichtgewichtiger Befehlszeilen-Parser

Beschreibung:

Mit diesem CommandLineParser ist es möglich übergeben Argumente zu parsen und in eine entsprechende Entity-Klasse exportieren zulassen, damit das Zugreifen der übergeben Argumente möglichst einfach gestaltet werden kann.

Das Format bzw. die Syntax der Argumente können selbstverständlich selbst definiert werden. Somit ist dieser Parser auch einfach abänderbar, ohne die Assembly neu zu kompilieren

** Download **

Die Assembly sowie ein entsprechendes Test-Projekt habe ich hier mal verknüpft.
Jeder kann damit machten was er will, dies ist einem komplett selbst überlassen.

Worauf ich mich jedoch freuen würde, wären Verbesserungsvorschläge, da ich noch nie eine Assembly entworfen habe, die für mehr bestimmt war, als bei mir zuhause genutzt zu werden.

Meine ProjektMappe ist als RAR im Anhang hinterlegt.

Nutzung

Die Nutzung ist im Prinzib ziemlich einfach gehalten.
Als Grundlage nehmen wir folgende Argumente:


--Address="Eine kleine Straße" --Name=MeinName  --Long=NotBad -i=42 -U -c=meineCompany

Hierbei gibt es folgende Features:*Ausgeschriebene Parameter (werden eingeleitet mit '--') *Kurzgeschriebene Parameter (werden eingeleitet mit '-') *Mehrere Typen sind erlaubt (string, int, bool, weitere folgend noch...) *Über Attribute lassen sich Felder benutzerdefiniert einstellen *Attribute werden automatisch in eine entsprechende Entity gemappt. *Abrufen von HilfeTexten, welche für jede Property gesetzt werden können.

** - Entity**

Hier möchte ich kurz erklären, wie eine solche Entity aussehen kann.


public class Option
    {
        [Command(Help="SomeHelp")]
        public string Adress { get; set; }

        [Command(Required=true)]
        public string Name { get; set; }

        [Command(Name="Long", Help="SomeMoreHelp")]
        public string AVeryVeryVeryLongProperty { get; set; }

        [Command(ShortName="i")]
        public int Id { get; set; }

        [Command]
        public bool UseSomeThing { get; set; }

        [Command(Name="Company", ShortName="c", Required=true)]
        public string Company { get; set; }
    }

Insgesammt gibt es 4 Möglichkeiten eine Property zu definieren:
*Name: Hier kann man den Namen der Option definieren. Beispiel: --Name In diesem Fall wäre 'Name' der Name der jeweiligen Option. Ist dieser Wert nicht gesetzt, so wird automatisch der Name der Property benutzt. *ShortName: Hier kann man den Kürzel (Kurzschreibweiße) einer Option definieren. Beispiel: -N In diesem Fall wäre 'N' die Kurzschreibform. Ist auch dieser Wert nicht gesetzt, so wird das erste Zeichen des Property-Namen benutzt. *Help: Dies ist die Beschreibung zu der jeweiligen Option. Falls der User diese einfordern möchte. *Required: Setzt man dies, möchte man erzwingen, dass eine entsprechende Option gesetzt werden muss. Trifft dies nicht zu, führt dies zu einer Exception.

** - Syntax defination **

Selbstverständlich können die entsprechenden Separatoren frei definiert werden.
Hier ein kleines Beispiel wie man eine eigene Syntax definieren kann:


var parser = new CommandParser(true);
parser.RegisterSyntax(SyntaxType.ShortOptionInitiator, "-");
parser.RegisterSyntax(SyntaxType.OptionInitiator, "--");
parser.RegisterSyntax(SyntaxType.ValueSeparator, "=");

Standardmäßig werden die oben gennanten Beispiele schon im Konstruktor definiert.

** - Help **

Bei Fehleingaben oder sonstigen Problemen hat man die Möglichkeit, den Nutzern eine entsprechende Hilfe zu den Optionen anzeigen zulassen.


var result = Help.GetHelp<Option>();

Hier wird ein Dictionary zurück gegeben, als Key wird der PropertyName verwendet, als Value der entsprechende Hilfe-Text welchen man über die Attribute vergeben hat.

** - Parsen **

Hier mal ein komplettes Beispiel, wie man diesen Parser benutzt:


var parser = new CommandParser(true);

var resultList = parser.Parse(args);

var mapper = new CommandMapper();
var entity = mapper.Mapp<Option>(resultList);

Schlagwörter: <Bitte Schlagwörter, unter denen dein Snippet über die Suche gefunden werden soll, hier eintragen>

16.806 Beiträge seit 2008
vor 9 Jahren

Das ist doch exakt das Handling, dass das NuGet-Paket 'CommandLineParser' auch inne hat, oder ist der Name nur ungluecklich gewaehlt, oder ist es ein Fork?

R
Repac3r Themenstarter:in
57 Beiträge seit 2014
vor 9 Jahren

Das ist doch exakt das Handling, dass das NuGet-Paket 'CommandLineParser' auch inne hat, oder ist der Name nur ungluecklich gewaehlt, oder ist es ein Fork?

Das ist mir bisher noch nicht aufgefallen, dann ist der Name einfach nur unglücklich gewählt worden.