Übersicht über die Befehlszeilensyntax für System.CommandLine
Wichtig
System.CommandLine
befindet sich derzeit in der VORSCHAU, und diese Dokumentation gilt für Version 2.0 Beta 4.
Einige Informationen beziehen sich auf Vorabversionen des Produkts, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
In diesem Artikel wird die Befehlszeilensyntax erläutert, die von System.CommandLine
erkannt wird. Die Informationen sind sowohl für Benutzer als auch für Entwickler von .NET-Befehlszeilen-Apps nützlich, einschließlich der .NET CLI.
Token
System.CommandLine
analysiert die Befehlszeileneingabe in Token, die durch Leerzeichen getrennte Zeichenfolgen sind. Nehmen wir z. B. die folgende Befehlszeile:
dotnet tool install dotnet-suggest --global --verbosity quiet
Diese Eingabe wird von der Anwendung dotnet
in die Token tool
, install
, dotnet-suggest
, --global
, --verbosity
und quiet
analysiert.
Token werden als Befehle, Optionen oder Argumente interpretiert. Die App in der Befehlszeile, die aufgerufen wird, bestimmt, wie die Token nach dem ersten Token interpretiert werden. In der folgenden Tabelle wird gezeigt, wie System.CommandLine
das vorherige Beispiel interpretiert:
Token | Analysiert als |
---|---|
tool |
Unterbefehl |
install |
Unterbefehl |
dotnet-suggest |
Argument für den Installationsbefehl |
--global |
Option für Installationsbefehl |
--verbosity |
Option für Installationsbefehl |
quiet |
Argument für die --verbosity -Option |
Ein Token kann Leerzeichen enthalten, wenn es in Anführungszeichen eingeschlossen ist ("
). Hier sehen Sie ein Beispiel:
dotnet tool search "ef migrations add"
Befehle
Ein Befehl in der Befehlszeileneingabe ist ein Token, das eine Aktion angibt oder eine Gruppe verwandter Aktionen definiert. Zum Beispiel:
- In
dotnet run
istrun
ein Befehl, der eine Aktion angibt. - In
dotnet tool install
istinstall
ein Befehl, der eine Aktion angibt, undtool
ist ein Befehl, der eine Gruppe verwandter Befehle angibt. Es gibt noch weitere toolbezogene Befehle, wietool uninstall
,tool list
undtool update
.
Stammbefehle
Der root-Befehl ist derjenige, der den Namen der ausführbaren Datei der App angibt. Beispielsweise gibt der Befehl dotnet
die ausführbare Datei dotnet.exe an.
Unterbefehle
Die meisten Apps für die Befehlszeile unterstützen Unterbefehle, auch bekannt als Verben. Der dotnet
-Befehl hat z. B. einen Unterbefehl run
, den Sie durch Eingabe von dotnet run
aufrufen.
Unterbefehle können über eigene Unterbefehle verfügen. In dotnet tool install
ist install
ein Unterbefehl von tool
.
Optionen
Eine Option ist ein benannter Parameter, der an einen Befehl übergeben werden kann. POSIX-CLIs stellen in der Regel dem Optionsnamen zwei Bindestrichen (--
) voran. Das folgende Beispiel zeigt zwei Optionen:
dotnet tool update dotnet-suggest --verbosity quiet --global
^---------^ ^------^
Wie dieses Beispiel zeigt, kann der Wert der Option explizit (quiet
für --verbosity
) oder implizit (nichts folgt auf --global
) sein. Optionen, für die kein Wert angegeben ist, sind in der Regel boolesche Parameter, die standardmäßig true
lauten, wenn die Option in der Befehlszeile angegeben wird.
Bei einigen Windows-Befehlszeilen-Apps identifizieren Sie eine Option mithilfe eines führenden Schrägstrichs (/
) mit dem Optionsnamen. Zum Beispiel:
msbuild /version
^------^
System.CommandLine
unterstützt sowohl POSIX- als auch Windows-Präfixkonventionen. Wenn Sie eine Option konfigurieren, geben Sie den Optionsnamen einschließlich des Präfixes an.
Argumente
Ein Argument ist ein Wert, der an eine Option oder einen Befehl übergeben wird. Die folgenden Beispiele zeigen ein Argument für die Option verbosity
und ein Argument für den Befehl build
.
dotnet tool update dotnet-suggest --verbosity quiet --global
^---^
dotnet build myapp.csproj
^----------^
Argumente können Standardwerte aufweisen, die angewendet werden, wenn kein Argument explizit angegeben wird. Viele Optionen sind beispielsweise implizit boolesche Parameter mit einem Standardwert von true
, wenn sich der Optionsname in der Befehlszeile befindet. Die folgenden Befehlszeilenbeispiele sind gleichwertig:
dotnet tool update dotnet-suggest --global
^------^
dotnet tool update dotnet-suggest --global true
^-----------^
Für einige Optionen sind Argumente erforderlich. In der .NET CLI erfordert --output
z. B. ein Argument für den Ordnernamen. Wenn das Argument nicht angegeben wird, tritt bei dem Befehl ein Fehler auf.
Argumente können erwartete Typen aufweisen, und System.CommandLine
zeigt eine Fehlermeldung an, wenn ein Argument nicht in den erwarteten Typ analysiert werden kann. Beispielsweise ist der folgende Befehl fehlerhaft, da „silent“ nicht zu den gültigen Werten für --verbosity
gehört:
dotnet build --verbosity silent
Cannot parse argument 'silent' for option '-v' as expected type 'Microsoft.DotNet.Cli.VerbosityOptions'. Did you mean one of the following?
Detailed
Diagnostic
Minimal
Normal
Quiet
Argumente haben auch Erwartungen dahingehend, wie viele Werte bereitgestellt werden können. Beispiele finden Sie im Abschnitt zur Argumentarität.
Reihenfolge der Optionen und Argumente
Sie können Optionen vor Argumenten oder Argumente vor Optionen in der Befehlszeile angeben. Die folgenden Befehle sind gleichwertig:
dotnet add package System.CommandLine --prerelease
dotnet add package --prerelease System.CommandLine
Die Optionen können in beliebiger Reihenfolge angegeben werden. Die folgenden Befehle sind gleichwertig:
dotnet add package System.CommandLine --prerelease --no-restore --source https://api.nuget.org/v3/index.json
dotnet add package System.CommandLine --source https://api.nuget.org/v3/index.json --no-restore --prerelease
Wenn es mehrere Argumente gibt, spielt die Reihenfolge eine Rolle. Die folgenden Befehle sind nicht unbedingt gleichwertig:
myapp argument1 argument2
myapp argument2 argument1
Diese Befehle übergeben eine Liste mit denselben Werten an den Befehlshandlercode, unterscheiden sich aber in der Reihenfolge der Werte, was zu unterschiedlichen Ergebnissen führen kann.
Aliase
Sowohl unter POSIX als auch unter Windows ist es üblich, dass einige Befehle und Optionen Aliase haben. Dies sind in der Regel Kurzformen, die leichter einzugeben sind. Aliase können auch für andere Zwecke verwendet werden, z. B. um die nicht Beachtung der Groß-/Kleinschreibung zu simulieren und um alternative Schreibweisen eines Worts zu unterstützen.
POSIX-Kurzformen haben in der Regel einen einzelnen führenden Bindestrich, gefolgt von einem einzelnen Zeichen. Die folgenden Befehle sind gleichwertig:
dotnet build --verbosity quiet
dotnet build -v quiet
Der GNU-Standard empfiehlt automatische Aliase. Das heißt, Sie können einen beliebigen Teil eines Befehls oder Optionsnamens in der langen Form eingeben und er wird akzeptiert. Durch dieses Verhalten würden die folgenden Befehlszeilen gleichwertig werden:
dotnet publish --output ./publish
dotnet publish --outpu ./publish
dotnet publish --outp ./publish
dotnet publish --out ./publish
dotnet publish --ou ./publish
dotnet publish --o ./publish
System.CommandLine
unterstützt keine automatischen Aliase.
Groß- und Kleinschreibung
Bei Befehls- und Optionsnamen sowie Aliasen wird standardmäßig gemäß der POSIX-Konvention die Groß-/Kleinschreibung beachtet, und System.CommandLine
folgt dieser Konvention. Wenn Sie möchten, dass Ihre Befehlszeilenschnittstelle die Groß- und Kleinschreibung nicht beachtet, definieren Sie Aliase für die verschiedenen Alternativen der Groß-/Kleinschreibung. Beispielsweise könnte --additional-probing-path
die Aliase --Additional-Probing-Path
und --ADDITIONAL-PROBING-PATH
haben.
In einigen Befehlszeilentools weist ein Unterschied in der Groß-/Kleinschreibung auf einen Unterschied in der Funktion hin. Beispielsweise verhält sich git clean -X
anders als git clean -x
. Die .NET CLI verwendet die Kleinschreibung.
Die Groß- und Kleinschreibung wird bei Argumenten für Optionen, die auf Enumerationen basieren, nicht beachtet. Enumerationsnamen werden unabhängig von der Groß-/Kleinschreibung abgeglichen.
--
-Token
Die POSIX-Konvention interpretiert das Doppelstrichtoken (--
) als Escapemechanismus. Alles, was auf das Doppelstrichtoken folgt, wird als Argument für den Befehl interpretiert. Diese Funktion kann verwendet werden, um Argumente zu übermitteln, die wie Optionen aussehen, da sie verhindert, dass sie als Optionen interpretiert werden.
Angenommen, myapp übernimmt ein message
-Argument und Sie möchten, dass der Wert von message
entsprechend --interactive
ist. Die folgende Befehlszeile kann zu unerwarteten Ergebnissen führen.
myapp --interactive
Wenn myapp
keine --interactive
-Option hat, wird das --interactive
-Token als Argument interpretiert. Wenn die App jedoch eine --interactive
-Option aufweist, wird diese Eingabe als Verweis auf diese Option interpretiert.
Die folgende Befehlszeile verwendet das Doppelstrichtoken, um den Wert des message
-Arguments auf „--interactive“ festzulegen:
myapp -- --interactive
^^
System.CommandLine
unterstützt diese Doppelstrichfunktion.
Trennzeichen für Optionsargumente
System.CommandLine
ermöglicht es Ihnen, ein Leerzeichen, „=“ oder „:“ als Trennzeichen zwischen einem Optionsnamen und seinem Argument zu verwenden. Die folgenden Befehle sind z. B. gleichwertig:
dotnet build -v quiet
dotnet build -v=quiet
dotnet build -v:quiet
Mit einer POSIX-Konvention können Sie das Trennzeichen weglassen, wenn Sie einen Optionsalias angeben, der aus einem einzelnen Zeichen besteht. Die folgenden Befehle sind z. B. gleichwertig:
myapp -vquiet
myapp -v quiet
System.CommandLine unterstützt diese Syntax standardmäßig.
Argumentarität
Die Arität oder „Stelligkeit“ eines Options- oder Befehlsarguments ist die Anzahl der Werte, die übergeben werden können, wenn diese Option oder dieser Befehl angegeben ist.
Die Arität wird durch einen Mindest- und einen Höchstwert ausgedrückt, wie die folgende Tabelle veranschaulicht:
Min | Max | Beispiel: Gültigkeit | Beispiel |
---|---|---|---|
0 | 0 | Gültig: | --file |
Ungültig: | --file a.json | ||
Ungültig: | --file a.json --file b.json | ||
0 | 1 | Gültig: | --flag |
Gültig: | --flag true | ||
Gültig: | --flag false | ||
Ungültig: | --flag false --flag false | ||
1 | 1 | Gültig: | --file a.json |
Ungültig: | --file | ||
Ungültig: | --file a.json --file b.json | ||
0 | n | Gültig: | --file |
Gültig: | --file a.json | ||
Gültig: | --file a.json --file b.json | ||
1 | n | Gültig: | --file a.json |
Gültig: | --file a.json b.json | ||
Ungültig: | --file |
System.CommandLine
hat eine ArgumentArity-Struktur zur Definition der Arität mit den folgenden Werten:
- Zero – Keine Werte zulässig.
- ZeroOrOne – Kann einen Wert haben, kann keine Werte haben.
- ExactlyOne – Muss einen Wert haben.
- ZeroOrMore – Kann einen Wert, mehrere Werte oder keine Werte haben.
- OneOrMore – Kann mehrere Werte haben, muss aber mindestens einen Wert haben.
Ein Rückschluss auf die Arität ist häufig über den Typ möglich. Beispielsweise hat eine int
-Option die Arität ExactlyOne
und eine List<int>
-Option die Arität OneOrMore
aufweisen.
Außerkraftsetzung von Optionen
Wenn der Höchstwert für die Arität 1 ist, kann System.CommandLine
trotzdem so konfiguriert werden, dass es mehrere Instanzen einer Option akzeptiert. In diesem Fall überschreibt die letzte Instanz einer wiederholten Option alle früheren Instanzen. Im folgenden Beispiel würde der Wert 2 an den myapp
-Befehl übergeben werden.
myapp --delay 3 --message example --delay 2
Mehrere Argumente
Wenn der Höchstwert für die Arität mehr als eins beträgt, kann System.CommandLine
so konfiguriert werden, dass mehrere Argumente für eine Option akzeptiert werden, ohne den Optionsnamen zu wiederholen.
Im folgenden Beispiel würde die an den Befehl myapp
übergebene Liste „a“, „b“, „c“ und „d“ enthalten:
myapp --list a b c --list d
Bündeln von Optionen
POSIX empfiehlt, dass Sie die Bündelung von Optionen unterstützen, die ein einzelnes Zeichen umfassen, auch bekannt als Stapelung. Gebündelte Optionen sind Optionsaliase für einzelne Zeichen, die zusammen nach einem einzelnen Bindestrichpräfix angegeben werden. Nur die letzte Option kann ein Argument angeben. Die folgenden Befehlszeilen sind z. B. gleichwertig:
git clean -f -d -x
git clean -fdx
Wenn ein Argument nach einem Optionsbündel angegeben wird, gilt es für die letzte Option im Bündel. Die folgenden Befehlszeilen sind gleichwertig:
myapp -a -b -c arg
myapp -abc arg
In beiden Varianten in diesem Beispiel würde das Argument arg
nur für die Option -c
gelten.
Boolesche Optionen (Flags)
Wenn true
oder false
für eine Option mit einem bool
-Argument übergeben wird, erfolgt die Analyse erwartungsgemäß. Aber eine Option, deren Argumenttyp bool
ist, erfordert normalerweise keine Angabe eines Arguments. Boolesche Optionen, die manchmal auch als „Flags“ bezeichnet werden, haben in der Regel eine Arität von ZeroOrOne. Das Vorhandensein des Optionsnamens in der Befehlszeile, ohne dass ein Argument folgt, führt zu dem Standardwert true
. Das Fehlen des Optionsnamens in der Befehlszeileneingabe führt zu einem Wert von false
. Wenn der Befehl myapp
den Wert einer booleschen Option namens --interactive
ausgibt, erstellt die folgende Eingabe die folgende Ausgabe:
myapp
myapp --interactive
myapp --interactive false
myapp --interactive true
False
True
False
True
--help-Option
Apps für die Befehlszeile bieten in der Regel eine Option zur Anzeige einer kurzen Beschreibung der verfügbaren Befehle, Optionen und Argumente. System.CommandLine
generiert automatisch eine Hilfeausgabe. Zum Beispiel:
dotnet list --help
Description:
List references or packages of a .NET project.
Usage:
dotnet [options] list [<PROJECT | SOLUTION>] [command]
Arguments:
<PROJECT | SOLUTION> The project or solution file to operate on. If a file is not specified, the command will search the current directory for one.
Options:
-?, -h, --help Show command line help.
Commands:
package List all package references of the project or solution.
reference List all project-to-project references of the project.
Benutzer von Apps sind möglicherweise daran gewöhnt, auf verschiedenen Plattformen auf unterschiedliche Weise Hilfe anzufordern, sodass in der System.CommandLine
erstellte Apps auf viele Arten der Anforderung von Hilfe reagieren. Die folgenden Befehle sind alle gleichwertig:
dotnet --help
dotnet -h
dotnet /h
dotnet -?
dotnet /?
In der Hilfeausgabe werden nicht unbedingt alle verfügbaren Befehle, Argumente und Optionen angezeigt. Einige von ihnen können ausgeblendet sein, d. h. sie werden nicht in der Hilfeausgabe angezeigt, können aber in der Befehlszeile angegeben werden.
--version-Option
Apps, die für die System.CommandLine
erstellt wurden, liefern die Versionsnummer automatisch als Antwort auf die --version
-Option, die mithilfe des root-Befehls verwendet wird. Zum Beispiel:
dotnet --version
6.0.100
MSBuild-Antwortdateien
Eine Antwortdatei ist eine Datei, die eine Reihe von Token für eine Befehlszeilen-App enthält. Antwortdateien sind ein Feature der System.CommandLine
, das in zwei Szenarien nützlich ist:
- Zum Aufrufen einer App in der Befehlszeile durch Angabe einer Eingabe, die länger ist als das Zeichenlimit des Terminals.
- Zum wiederholten Aufrufen desselben Befehls, ohne die gesamte Zeile erneut einzugeben.
Um eine Antwortdatei zu verwenden, geben Sie den Dateinamen mit einem vorangestellten @
-Zeichen an der Stelle in der Zeile ein, an der Sie Befehle, Optionen und Argumente einfügen möchten. Die RSP-Dateierweiterung ist eine gängige Konvention, aber Sie können jede beliebige Dateierweiterung verwenden.
Die nachfolgenden Zeilen sind identisch:
dotnet build --no-restore --output ./build-output/
dotnet @sample1.rsp
dotnet build @sample2.rsp --output ./build-output/
Inhalt von sample1.rsp:
build
--no-restore
--output
./build-output/
Inhalt von sample2.rsp:
--no-restore
Hier finden Sie Syntaxregeln, die bestimmen, wie der Text in einer Antwortdatei interpretiert wird:
- Token werden durch Leerzeichen getrennt. Eine Zeile, die Guten Morgen! enthält, wird als zwei Token behandelt, Guten und Morgen!.
- Mehrere in Anführungszeichen eingeschlossene Token werden als ein einzelnes Token interpretiert. Eine Zeile, die „Guten Morgen!“ enthält, wird als einzelnes Token behandelt, Guten Morgen!.
- Jeder Text zwischen einem
#
-Symbol und dem Ende der Zeile wird als Kommentar behandelt und ignoriert. - Token mit dem Präfix
@
können auf zusätzliche Antwortdateien verweisen. - Die Antwortdatei kann mehrere Textzeilen umfassen. Die Zeilen werden verkettet und als eine Tokensequenz interpretiert.
Anweisungen
System.CommandLine
führt ein syntaktisches Element namens Direktive ein. Die [parse]
-Direktive ist ein Beispiel dafür. Wenn Sie [parse]
nach dem Namen der App einfügen, zeigt System.CommandLine
ein Diagramm des Analyseergebnisses an, anstatt die Befehlszeilen-App aufzurufen:
dotnet [parse] build --no-restore --output ./build-output/
^-----^
[ dotnet [ build [ --no-restore <True> ] [ --output <./build-output/> ] ] ]
Der Zweck von Direktiven ist es, übergreifende Funktionen bereitzustellen, die in allen Befehlszeilen-Apps angewendet werden können. Da sich die Direktiven syntaktisch von der eigenen Syntax der App unterscheiden, können sie Funktionen bereitstellen, die App-übergreifend gelten.
Eine Direktive muss den folgenden Syntaxregeln entsprechen:
- Es ist ein Token in der Befehlszeile, das hinter dem Namen der App, aber vor allen Unterbefehlen oder Optionen steht.
- Sie ist in eckige Klammern eingeschlossen.
- Sie enthält keine Leerzeichen.
Eine nicht erkannte Direktive wird ignoriert, ohne einen Analysefehler zu verursachen.
Eine Direktive kann ein Argument enthalten, das durch einen Doppelpunkt vom Direktivennamen getrennt ist.
Die folgenden Direktiven sind integriert:
Die [parse]
-Direktive
Sowohl Benutzer als auch Entwickler können es nützlich finden, zu sehen, wie eine App eine bestimmte Eingabe interpretiert. Eines der standardmäßigen Features einer System.CommandLine
-App ist die [parse]
-Direktive, mit der Sie das Ergebnis der Analyse der Befehlseingabe in der Vorschau anzeigen können. Beispiel:
myapp [parse] --delay not-an-int --interactive --file filename.txt extra
![ myapp [ --delay !<not-an-int> ] [ --interactive <True> ] [ --file <filename.txt> ] *[ --fgcolor <White> ] ] ???--> extra
Im vorherigen Beispiel:
- Der Befehl (
myapp
), seine untergeordneten Optionen und die Argumente für diese Optionen werden mithilfe von eckigen Klammern gruppiert. - Für das Optionsergebnis
[ --delay !<not-an-int> ]
zeigt!
einen Analysefehler an. Der Wertnot-an-int
für eineint
-Option kann nicht auf den erwarteten Typ analysiert werden. Der Fehler wird auch durch!
vor dem Befehl gekennzeichnet, der die fehlerhafte Option enthält:![ myapp...
. - Für das Optionsergebnis
*[ --fgcolor <White> ]
wurde die Option nicht in der Befehlszeile angegeben, sodass der konfigurierte Standardwert verwendet wurde.White
ist der effektive Wert für diese Option. Das Sternchen zeigt an, dass der Wert der Standardwert ist. ???-->
verweist auf eine Eingabe, die nicht mit einem der Befehle oder einer der Optionen der App übereinstimmt.
Die [suggest]
-Direktive
Mit der [suggest]
-Direktive können Sie nach Befehlen suchen, wenn Sie den genauen Befehl nicht kennen.
dotnet [suggest] buil
build
build-server
msbuild
Entwurfsleitfäden
In den folgenden Abschnitten finden Sie Hinweise, die Sie beim Entwurf einer CLI beachten sollten. Stellen Sie sich das, was Ihre App in der Befehlszeile erwartet, ähnlich vor wie das, was ein REST-API-Server in der URL erwartet. Konsistente Regeln für REST-APIs machen diese für die Entwickler von Client-Apps leicht nutzbar. Genauso werden die Benutzer Ihrer Befehlszeilen-Apps eine bessere Erfahrung haben, wenn der CLI-Entwurf gemeinsamen Mustern folgt.
Wenn Sie einmal eine CLI erstellt haben, ist es schwer zu ändern, insbesondere wenn Ihre Benutzer Ihre CLI in Skripts verwendet haben, von denen sie erwarten, dass sie weiterhin ausgeführt werden. Die hier aufgeführten Richtlinien wurden nach der .NET CLI entwickelt und folgen nicht immer diesen Richtlinien. Wir aktualisieren die .NET CLI dort, wo es möglich ist, ohne Breaking Changes vorzunehmen. Ein Beispiel für diese Arbeit ist der neue Entwurf für dotnet new
in .NET 7.
Befehle und Unterbefehle
Wenn ein Befehl Unterbefehle aufweist, sollte der Befehl als Bereich oder als Gruppierungsbezeichner für die Unterbefehle fungieren, anstatt eine Aktion anzugeben. Wenn Sie die App aufrufen, geben Sie den Gruppierungsbefehl und einen seiner Unterbefehle an. Wenn Sie z. B. versuchen, dotnet tool
auszuführen, erhalten Sie eine Fehlermeldung, da der Befehl tool
nur eine Gruppe von toolbezogenen Unterbefehlen identifiziert, z. B. install
und list
. Sie können dotnet tool install
ausführen, aber dotnet tool
allein wäre unvollständig.
Eine der Möglichkeiten zum Definieren von Bereichen hilft Ihren Benutzern dabei, die Hilfeausgabe zu organisieren.
Innerhalb einer CLI gibt es häufig einen impliziten Bereich. In der .NET CLI ist der implizite Bereich z. B. das Projekt und in der Docker-CLI das Image. Folglich können Sie dotnet build
verwenden, ohne einen Bereich einzuschließen. Überlegen Sie, ob Ihre CLI über einen impliziten Bereich verfügt. Wenn dies der Fall ist, sollten Sie überlegen, ob Sie dem Benutzer die Möglichkeit geben, sie optional einzuschließen oder wegzulassen, wie in docker build
und docker image build
. Wenn Sie optional zulassen, dass der implizite Bereich von Ihrem Benutzer typisiert wird, verfügen Sie auch automatisch über Hilfe und Vervollständigung mit der TAB-TASTE für diese Gruppierung von Befehlen. Stellen Sie die optionale Verwendung der impliziten Gruppe bereit, indem Sie zwei Befehle definieren, die denselben Vorgang ausführen.
Optionen als Parameter
Optionen sollten Parameter für Befehle bereitstellen, anstatt selbst Aktionen anzugeben. Dies ist ein empfohlenes Entwurfsprinzip, auch wenn es nicht immer von System.CommandLine
befolgt wird (--help
zeigt Hilfeinformationen an).
Kurzformaliase
Im Allgemeinen empfehlen wir Ihnen, die Anzahl der von Ihnen definierten Kurzformaliase für Optionen zu minimieren.
Vermeiden Sie es insbesondere, einen der folgenden Aliase anders zu verwenden, als es in der .NET CLI und anderen .NET-Befehlszeilen-Apps üblich ist:
-i
für--interactive
.Diese Option signalisiert dem Benutzer, dass er möglicherweise aufgefordert wird, Eingaben auf Fragen vorzunehmen, die für den Befehl beantwortet werden müssen. Beispielsweise die Aufforderung zur Eingabe eines Benutzernamens. Ihre CLI kann in Skripts verwendet werden. Seien Sie daher vorsichtig, wenn Sie Benutzer auffordern, die diesen Schalter nicht angegeben haben.
-o
für--output
.Einige Befehle erzeugen Dateien als Ergebnis ihrer Ausführung. Verwenden Sie diese Option, um zu bestimmen, wo diese Dateien gespeichert werden sollen. In Fällen, in denen eine einzelne Datei erstellt wird, sollte diese Option ein Dateipfad sein. In Fällen, in denen viele Dateien erstellt werden, sollte diese Option ein Verzeichnispfad sein.
-v
für--verbosity
.Befehle stellen dem Benutzer häufig eine Ausgabe auf der Konsole bereit. Diese Option wird verwendet, um die Menge der vom Benutzer angeforderten Ausgabe festzulegen. Weitere Informationen finden Sie unter
--verbosity
-Option weiter unten in diesem Artikel.
Es gibt auch einige Aliase, deren allgemeine Verwendung auf die .NET CLI beschränkt ist. Sie können diese Aliase für andere Optionen in Ihren Apps verwenden, aber seien Sie sich der Möglichkeit von Verwechslungen bewusst.
-c
für--configuration
Diese Option bezieht sich oft auf eine benannte Buildkonfiguration wie
Debug
oderRelease
. Sie können einen beliebigen Namen für eine Konfiguration verwenden, aber die meisten Tools erwarten einen dieser Namen. Diese Einstellung wird häufig verwendet, um andere Eigenschaften so zu konfigurieren, dass sie für diese Konfiguration sinnvoll sind – z. B. weniger Codeoptimierung beim Erstellen derDebug
-Konfiguration. Ziehen Sie diese Option in Betracht, wenn Ihr Befehl über unterschiedliche Betriebsmodi verfügt.-f
für--framework
Diese Option wird verwendet, um einen einzelnen Zielframeworkmoniker (Target Framework Moniker, TFM) für die Ausführung auszuwählen, sodass Sie dieses Flag unterstützen sollten, wenn Ihre CLI-Anwendung je nach ausgewähltem TFM ein unterschiedliches Verhalten aufweist.
-p
für--property
Wenn Ihre Anwendung schließlich MSBuild aufruft, muss der Benutzer diesen Aufruf oft in irgendeiner Weise anpassen. Mit dieser Option können MSBuild-Eigenschaften in der Befehlszeile angegeben und an den zugrunde liegenden MSBuild-Aufruf weitergegeben werden. Wenn Ihre App MSBuild nicht verwendet, aber eine Reihe von Schlüssel-Wert-Paaren benötigt, sollten Sie denselben Optionsnamen verwenden, um die Erwartungen der Benutzer zu erfüllen.
-r
für--runtime
Wenn Ihre Anwendung unter verschiedenen Runtimes ausgeführt werden kann oder eine Runtime-spezifische Logik aufweist, sollten Sie diese Option als Möglichkeit zur Angabe eines Runtimebezeichners unterstützen. Wenn Ihre App --runtime unterstützt, sollten Sie auch
--os
und--arch
unterstützen. Mit diesen Optionen können Sie nur die Teile des Betriebssystems oder der Architektur des RIDs angeben, wobei der nicht angegebene Teil von der aktuellen Plattform bestimmt wird. Weitere Informationen finden Sie unter dotnet publish.
Kurze Namen
Sorgen Sie dafür, dass die Namen für Befehle, Optionen und Argumente so kurz wie möglich werden und möglichst leicht zu buchstabieren sind. Wenn z. B. class
eindeutig genug ist, machen Sie den Befehl nicht zu classification
.
Namen in Kleinbuchstaben
Definieren Sie Namen nur in Kleinbuchstaben. Sie können jedoch Aliase in Großbuchstaben erstellen, damit die Groß-/Kleinschreibung für Befehle oder Optionen nicht beachtet werden muss.
Kebab Case-Namen
Verwenden Sie die Kebab Case-Variante, um Wörter zu unterscheiden. Beispiel: --additional-probing-path
.
Pluralisierung
Achten Sie innerhalb einer App auf eine einheitliche Pluralisierung. Mischen Sie z. B. keine Plural- und Singularnamen für Optionen, die mehrere Werte besitzen können (maximale Arität größer als eins):
Optionsnamen | Konsistenz |
---|---|
--additional-probing-paths und --sources |
✔️ |
--additional-probing-path und --source |
✔️ |
--additional-probing-paths und --source |
❌ |
--additional-probing-path und --sources |
❌ |
Verben im Vergleich zu Substantiven
Verwenden Sie Verben anstelle von Substantiven für Befehle, die sich auf Aktionen beziehen (ohne untergeordnete Unterbefehle), z. B: dotnet workload remove
, nicht dotnet workload removal
. Und verwenden Sie für Optionen z. B. eher Substantive als Verben: --configuration
, nicht --configure
.
--verbosity
-Option
System.CommandLine
-Anwendungen bieten in der Regel eine --verbosity
-Option, die angibt, wie umfangreich die an die Konsole gesendete Ausgabe wird. Hier sind die fünf Standardeinstellungen:
Q[uiet]
M[inimal]
N[ormal]
D[etailed]
Diag[nostic]
Dies sind die Standardnamen, aber bestehende Apps verwenden manchmal Silent
anstelle von Quiet
und Trace
, Debug
oder Verbose
anstelle von Diagnostic
.
Jede App definiert ihre eigenen Kriterien, die bestimmen, was auf jeder Ebene angezeigt wird. In der Regel benötigt eine App nur drei Ebenen:
- Quiet
- Normal
- Diagnose
Wenn eine App nicht fünf verschiedene Ebenen benötigt, sollte die Option dennoch die gleichen fünf Einstellungen definieren. In diesem Fall erzeugen Minimal
und Normal
die gleiche Ausgabe, und Detailed
und Diagnostic
sind ebenfalls gleich. So können Ihre Benutzer einfach das eingeben, womit sie vertraut sind, und es wird die beste Lösung verwendet.
Die Erwartung für Quiet
ist, dass keine Ausgabe auf der Konsole angezeigt wird. Wenn eine App jedoch einen interaktiven Modus bietet, sollte die App eine der folgenden Alternativen bereitstellen:
- Die Anzeige fordert zur Eingabe auf, wenn
--interactive
angegeben wird, auch wenn--verbosity
entsprechendQuiet
ist. - Verbieten Sie die gemeinsame Verwendung von
--verbosity Quiet
und--interactive
.
Andernfalls wartet die App auf Eingaben, ohne dem Benutzer mitzuteilen, worauf sie wartet. Es wird den Anschein erwecken, als sei Ihre Anwendung eingefroren und der Benutzer hat keine Ahnung, dass die Anwendung auf eine Eingabe wartet.
Wenn Sie Aliasnamen definieren, verwenden Sie -v
für --verbosity
und machen -v
ohne Argument zu einem Alias für --verbosity Diagnostic
. Verwenden Sie -q
für --verbosity Quiet
.
.NET CLI und POSIX-Konventionen
Die .NET CLI hält sich nicht konsequent an alle POSIX-Konventionen.
Doppelter Bindestrich
Mehrere Befehle in der .NET CLI weisen eine spezielle Implementierung des Doppelstrichtokens auf. Im Falle von dotnet run
, dotnet watch
und dotnet tool run
werden die Token, die auf --
folgen, an die App übergeben, die vom Befehl ausgeführt wird. Zum Beispiel:
dotnet run --project ./myapp.csproj -- --message "Hello world!"
^^
In diesem Beispiel wird die Option --project
an den Befehl dotnet run
übergeben, und die Option --message
mit ihrem Argument wird als Befehlszeilenoption an myapp übergeben, wenn sie ausgeführt wird.
Das --
-Token ist nicht immer erforderlich, um Optionen an eine App zu übergeben, die Sie mithilfe von dotnet run
ausführen. Ohne den doppelten Bindestrich gibt der Befehl dotnet run
automatisch alle Optionen an die auszuführende App weiter, die nicht als für dotnet run
selbst oder für MSBuild zutreffend erkannt werden. Die folgenden Befehlszeilen sind also gleichwertig, da dotnet run
die Argumente und Optionen nicht erkennt:
dotnet run -- quotes read --delay 0 --fg-color red
dotnet run quotes read --delay 0 --fg-color red
Weglassen des Option-zu-Argument-Trennzeichens
Die .NET CLI unterstützt nicht die POSIX-Konvention, die es Ihnen gestattet, das Trennzeichen wegzulassen, wenn Sie einen Optionsalias angeben, der aus einem Zeichen besteht.
Mehrere Argumente ohne Wiederholung des Optionsnamens
Die .NET CLI akzeptiert nicht mehrere Argumente für eine Option, ohne den Optionsnamen zu wiederholen.
Boolesche Optionen
In der .NET CLI führen einige boolesche Optionen zu demselben Verhalten, wenn Sie false
übergeben, wie wenn Sie true
übergeben. Dieses Verhalten tritt auf, wenn der .NET CLI-Code, der die Option implementiert, nur auf das Vorhandensein oder Fehlen der Option prüft und den Wert ignoriert. Ein Beispiel ist --no-restore
für den Befehl dotnet build
. Wenn Sie no-restore false
eingeben, wird der Wiederherstellungsvorgang genauso übersprungen wie bei der Angabe von no-restore true
oder no-restore
.
Kebab Case
In einigen Fällen verwendet die .NET CLI nicht den Kebab Case für Befehls-, Options- oder Argumentnamen. Beispielsweise gibt es eine .NET CLI-Option, die --additionalprobingpath
statt --additional-probing-path
heißt.