getopt.net - Getopt-ähnliches Argument-Parsing für .net

    • Release
    • Open Source

    Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von siycah.

      getopt.net - Getopt-ähnliches Argument-Parsing für .net

      Moin zusammen,

      Ich stelle heute mein neuestes kleines Projekt vor. Vielleicht findet das in einem eurer Applikationen Verwendung.
      Gestartet habe ich das Projekt gestern, da die bereits existierenden Libs entweder nicht cross-plattform-kompatibel waren, oder seit mehreren Jahren outdated sind und z.B. nicht bei mir auf dem Mac liefen.

      Da ich hauptsächlich mit C/++ arbeite und viel auf Linux, habe ich diese Funktionalität lieben gelernt und finde dass es sowas auch gerne (gewartet) für dotnet geben sollte.

      Name:
      getopt.net

      Beschreibung:
      Diese Lib parst Kommandozeilen-Argumente für dein Programm in einer getopt-ähnlichen Art.
      Sprich, anstatt dass man das Argumentparsing immer selber einbaut und ungleiches Verhalten zwischen den Applikationen hat, hat man einen standardisierten Weg, Argumente zu behandeln.

      Für alle, die getopt-Argument nicht kennen:

      getopt() erlaubt es, kurze Argumente zusammenzufassen und in einem String zu übergeben, sodass Programmaufrufe schneller erledigt sind.
      Ein gutes Beispiel ist tar.
      tar ist eine Applikation, mit der man Tar-Archive erstellen, entpacken und auch auslesen kann.

      Möchte man z.B. ein Tar-Archiv mit Gzip-Komprimierung erstellen, wäre der lange Befehl z.B. so:
      tar --gzip --create --verbose --recursive --file=my_tar.tgz <Dateien und Ordner>

      Durch die Funktion von getopt, kann man diesen Befehl wie folgt abkürzen:
      tar -cvzRf my_tar.tgz <Dateien und Ordner>

      Natürlich kann man auch die kurzen Optionen einzeln angeben; ganz wie es einem selber beliebt. Getopt bietet die Möglichkeit.

      Dafür gibt man im Programmcode einfach eine ShortOpt-Liste und wahlweise eine Longopt-Liste an.

      Die genauen Details findet ihr bei mir im GitHub-Repo: github.com/SimonCahill/getopt.net
      oder auf meiner Doku-Seite: docs.simonc.eu/docs/getopt.net

      Verwendete Programmiersprache(n) und IDE(s):
      C# 11, .net 7.0/6.0/4.6 und Visual Studio [für Mac].
      Als Testframework wurde MSTest verwendet; ist ebenfalls im Repo dabei.

      Systemanforderungen:
      Siehe verwendete Programmiersprachen.

      Systemveränderungen:
      Es werden keine Systemveränderungen vorgenommen, lediglich eine sehr coole Art von Argument-Parsing deinem Programm bereitgestellt ;)

      Download(s):
      Downloads sind als .tgz, .zip und Source-Code über mein oben verlinktenes GitHub-Repo verfügbar.
      Das Paket ist ebenfalls bei NuGet verfügbar: nuget.org/packages/getopt.net-bsd/

      Lizenz/Weitergabe:
      Diese Bibliothek ist - im Gegensatz zum Original und einiger Ports mit dem BSD 3-Clause lizensiert und nicht über die GPL.
      Ihr dürft die Bibliothek auch kommerziell verwenden, solange ihr die Lizenz zusammen mit der Bibliothek und eurem Programm ausliefert.
      Lizenzen eurer Programme sind nicht betroffen; sprich auch closed-source-Applikationen können diese Bibliothek verwenden!
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „siycah“ ()

      Update v0.3.1

      Hallo zusammen,

      Nach ein wenig Feedback von Entwicklern habe ich getopt.net bereits geupdatet und es ist nun in der Version 0.3.1 verfügbar.

      Alle Downloadlinks aus dem OP sind weiterhin gültig!

      Aktuellste Version bei NuGet: nuget.org/packages/getopt.net-bsd/0.3.1
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.
      Für meine VB-Freunde hier im Forum:

      Anbei eine Referenz-Implementierung mit getopt.net.

      VB.NET-Quellcode

      1. Option Strict On
      2. Imports System
      3. Imports System.IO
      4. Imports getopt.net
      5. Module Program
      6. Dim _progOptions() As [Option] = {
      7. New [Option]("help", ArgumentType.None, "h"c),
      8. New [Option]("version", ArgumentType.None, "v"c),
      9. New [Option]("file", ArgumentType.Required, "f"c)
      10. }
      11. Dim _progShortOptions As String = "hvf:"
      12. Sub Main(args As String())
      13. Dim getopt = New GetOpt With {
      14. .AppArgs = args,
      15. .Options = _progOptions,
      16. .ShortOpts = _progShortOptions
      17. }
      18. Dim optChar = 0
      19. Dim optArg As String = Nothing
      20. Dim fileToRead As String = Nothing
      21. While optChar <> -1
      22. optChar = getopt.GetNextOpt(optArg)
      23. Select Case optChar
      24. Case Convert.ToInt32("h"c) ' this is a god awful syntax.
      25. PrintHelp()
      26. Return
      27. Case Convert.ToInt32("v"c)
      28. PrintVersion()
      29. Return
      30. Case Convert.ToInt32("f"c)
      31. If optArg Is Nothing Then
      32. Console.Error.WriteLine("Missing input file!")
      33. Environment.ExitCode = 1
      34. Return
      35. End If
      36. fileToRead = optArg
      37. End Select
      38. End While
      39. If (fileToRead Is Nothing) Then
      40. Console.Error.WriteLine("Nothing to read. Exiting...")
      41. Environment.ExitCode = 1
      42. Return
      43. End If
      44. If Not File.Exists(fileToRead) Then
      45. Console.Error.WriteLine("The file " & fileToRead & " doesn't exist!")
      46. Environment.ExitCode = 2
      47. Return
      48. End If
      49. Console.WriteLine("Got file: " & fileToRead)
      50. Console.WriteLine(File.ReadAllText(fileToRead))
      51. End Sub
      52. Sub PrintHelp()
      53. Console.WriteLine("
      54. myapp (VB) v1.0.0
      55. Displays the usage of getopt.net in VB
      56. Usage:
      57. myapp [-h] [-v]
      58. myapp -f/path/to/file
      59. myapp -f /path/to/file
      60. myapp --file=/path/to/file
      61. myapp --file /path/to/file
      62. Arguments:
      63. --help, -h Displays this text and exits
      64. --version, -v Displays the version and exits
      65. --file=[file], -f Reads a file and outputs its contents
      66. ")
      67. End Sub
      68. Sub PrintVersion()
      69. Console.WriteLine("myapp (VB) v1.0.0")
      70. End Sub
      71. End Module


      Weitere Details: github.com/SimonCahill/getopt.…0/getopt.net.reference.vb
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.

      Version 0.5.1

      Es ist eine neue Version von getopt.net verfügbar!

      Seit dem letzten Update (im Forum!) haben sich folgende Änderungen ergeben:
      • ​Flag-Eigenschaft wurde rausgeschmissen
      • Windows-Style Argumente werden nun auch unterstützt
      • Es wurde eine neue Eigenschaft ​AllExceptionsDisabled eingeführt, welche das Ein-/Ausschalten aller Exceptions verwaltet.
      Downloads weiterhin über NuGet: nuget.org/packages/getopt.net-bsd/
      Oder direkt aus dem Repository: github.com/SimonCahill/getopt.net
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.

      Version 0.6.0

      Hallo zusammen,

      Vor einigen Tagen habe ich die Version 0.6.0 von getopt.net veröffentlicht!

      Änderungen in diesem Release:
      • Unterstützung von optionalen Argumenten in den ShortOpts.

      Erklärung:
      Sowohl GNU- als auch POSIX-kompatible getopt-Implementierungen erlauben die Verwendung von reinen Short-Opts.
      Dieser String ist dann wie folgt aufgebaut: Ein Zeichen (A-z0-9 & Sonderzeichen) und wahlweise ein Modifier.
      Dieser Modifier kann entweder ein Doppelpunkt (:) sein, was dann bedeutet, dass ein Argument für die Option zwingend notwendig ist;
      alternativ kann dieser Modifier auch (und getopt.net unterstützt dies seit v0.6.0) ein Semikolon (;) sein. Ein Semikolon bedeutet, dass ein Argument optional auch zu dieser Option gegeben werden kann.

      Ein ShortOpt-String mit einer Option 'h' ohne Argument, eine Option 'C' mit optionalem Argument und einer Option 'i' mit notwendigem Argument würde bspw. so aussehen: ​"hC;i:"

      Nachwievor unterstützt getopt.net auch die anderen Konstellationen. Optionen und ihre Argumente können wild durcheinander gewürfelt werden: ​"hvc;C:f:pklq;tmyj:".

      Heruntergeladen werden kann das Paket nachwievor über NuGet, oder direkt bei GitHub.

      Bei Fragen oder Anregungen gerne hier im Faden eine Antwort erstellen, oder bei GitHub ein Issue erstellen!
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.

      Version 0.7.0

      Hallo zusammen,

      Soeben wurde Version 0.7.0 von getopt.net veröffentlich!

      Dieses Release ist ein relativ kleines und bringt keine Breaking-Changes!

      Änderungen in diesem Release:
      • Unterstützung für Powershell Argumente
        • Powershell-Argumente verwenden einen einzelnen Bindestrich für lange und kurze Options (-lang -K)
        • Der Support ist standardmäßig deaktiviert
        • Um Support zu aktivieren, muss ​AllowPowershellConventions = true gesetzt werden
        • Es werden auch Powershell-Options mit Windows-ähnlichen Argumenten ​-myopt:argument unterstützt, allerdings muss hierfür ebenfalls ​AllowWindowsConventions = true gesetzt werden.

      Download:
      Das Paket ist ab sofort bei Nuget und bei GitHub zum Download verfügbar!

      Da es sich hierbei um eine relativ kleine Änderung/Erneuerung handelt, wurde die Referenz-Implementierung nicht angepasst.

      Bei Fragen, Anmerkungen oder Feature-Requests gerne hier im Forum oder (noch besser) bei GitHub ein Issue erstellen!

      Frohes Parsen!
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.

      Version 0.8.0

      Version 0.8.0 von getopt.net ist veröffentlicht!

      Version 0.8.0 bringt ein neues Feature mit, für Anwendungen mit vielen und/oder komplexen Argumenten/Optionen.

      Speziell bringt 0.8.0 Unterstützung für "paramfiles", diese sind Dateien, welches mit folgender Syntax an eure Programme übergeben werden können: ​@/path/to/file.
      Diese Dateien enthalten pro Zeile Argumente, die man ebenfalls an getopt.net/dem Programm übergeben werden.

      Das heißt konkret, jede Zeile kann entweder mehrere Kurzoptionen halten, oder ein Option mit Argument.

      Diese Version ist ab sofort bei NuGet und GitHub verfügbar.
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.

      Version 0.9.0

      Hallo zusammen!

      Vor einigen Tagen wurde die neueste Version von getopt.net veröffentlicht.

      Version 0.9.0 beinhaltet einen Non-Breaking-Change, der Paramfiles betrifft:
      • Kommentare werden nun in Paramfiles unterstützt
      • Kommentare müssen am Beginn der Zeile mit einer Raute (#) als Präfix stehen

      Die Version ist ab sofort bei GitHub und NuGet verfügbar.
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.

      Version 0.9.1

      Hallo zusammen,

      Heute wurde eine neue Version von getopt.net veröffentlicht; Version 0.9.1.

      Dieses Update enthält ein kleines QoL Update und ein Paket für .net8.

      Version 0.9.1 beinhaltet folgende Änderungen:
      • .net8 Pakete
      • Neue Extension-Methode um Option[] in ein Shortopt-String zu wandeln.

      Die Version ist ab sofort bei GitHub und NuGet verfügbar.
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.

      Version 1.0.0

      Hallo zusammen,

      Heute wurde eine neue Version von getopt.net veröffentlicht; Version 1.0.0

      Dieses Update bringt ein non-breaking Feature mit sich.

      Version 1.0.0:
      • Dynamisches Erstellen von Hilfstexten

      Verwendung:

      C#-Quellcode

      1. static void PrintHelp(GetOpt getopt) {
      2. Console.WriteLine(getopt.GenerateHelpText(new HelpTextConfig {
      3. ApplicationName = "getopt.net reference",
      4. ApplicationVersion = "v1.0.0",
      5. FooterText = "This is a reference implementation of getopt.net in C#.",
      6. OptionConvention = OptionConvention.GnuPosix,
      7. ShowSupportedConventions = true,
      8. CopyrightDate = new DateTime(2023, 1, 1),
      9. CopyrightHolder = "Simon Cahill (contact@simonc.eu)"
      10. }));
      11. }


      Resultat:

      Quellcode

      1. getopt.net reference v1.0.0
      2. Usage:
      3. getopt.net reference [options]
      4. Supported option conventions:
      5. Windows (/): yes
      6. Powershell (-): yes
      7. Gnu/Posix (-, --): yes
      8. Switches:
      9. -h, --help Displays this help text.
      10. -v, --version Displays the version of this program.
      11. Options:
      12. Reads the file back to stdout. The file is read into a local buffer and then printed out. Also I created this really long description to show
      13. -f, --file that getopt.net can handle long descriptions.
      14. This is a reference implementation of getopt.net in C#.


      Die Version ist ab sofort bei GitHub und NuGet verfügbar.
      Quellcode lizensiert unter CC by SA 2.0 (Creative Commons Share-Alike)

      Meine Firma: Procyon Systems

      Selbstständiger Softwareentwickler & IT-Techniker.