Opdrachten, opties en argumenten definiëren in System.CommandLine
Belangrijk
System.CommandLine
bevindt zich momenteel in PREVIEW en deze documentatie is voor versie 2.0 beta 4.
Sommige informatie heeft betrekking op voorlopige versie van het product dat aanzienlijk kan worden gewijzigd voordat het wordt vrijgegeven. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
In dit artikel wordt uitgelegd hoe u opdrachten, opties en argumenten definieert in opdrachtregel-apps die zijn gebouwd met de System.CommandLine
bibliotheek. Als u een volledige toepassing wilt bouwen die deze technieken illustreert, raadpleegt u de zelfstudie Aan de slag met System.CommandLine.
Zie Ontwerprichtlijnen voor hulp bij het ontwerpen van de opdrachten, opties en argumenten van een opdrachtregel-app.
Een hoofdopdracht definiëren
Elke opdrachtregel-app heeft een hoofdopdracht, die verwijst naar het uitvoerbare bestand zelf. Het eenvoudigste geval voor het aanroepen van uw code, als u een app zonder subopdrachten, opties of argumenten hebt, ziet er als volgt uit:
using System.CommandLine;
class Program
{
static async Task Main(string[] args)
{
var rootCommand = new RootCommand("Sample command-line app");
rootCommand.SetHandler(() =>
{
Console.WriteLine("Hello world!");
});
await rootCommand.InvokeAsync(args);
}
}
Subopdrachten definiëren
Opdrachten kunnen onderliggende opdrachten hebben, ook wel subopdrachten of werkwoorden genoemd, en ze kunnen zoveel niveaus nesten als u nodig hebt. U kunt subopdrachten toevoegen, zoals wordt weergegeven in het volgende voorbeeld:
var rootCommand = new RootCommand();
var sub1Command = new Command("sub1", "First-level subcommand");
rootCommand.Add(sub1Command);
var sub1aCommand = new Command("sub1a", "Second level subcommand");
sub1Command.Add(sub1aCommand);
De binnenste subopdracht in dit voorbeeld kan als volgt worden aangeroepen:
myapp sub1 sub1a
Opties definiëren
Een opdrachthandlermethode heeft doorgaans parameters en de waarden kunnen afkomstig zijn van opdrachtregelopties. In het volgende voorbeeld worden twee opties gemaakt en toegevoegd aan de hoofdopdracht. De optienamen bevatten voorvoegsels met dubbele afbreekstreepjes, wat gebruikelijk is voor POSIX CLIs. De opdrachthandlercode geeft de waarden van deze opties weer:
var delayOption = new Option<int>
(name: "--delay",
description: "An option whose argument is parsed as an int.",
getDefaultValue: () => 42);
var messageOption = new Option<string>
("--message", "An option whose argument is parsed as a string.");
var rootCommand = new RootCommand();
rootCommand.Add(delayOption);
rootCommand.Add(messageOption);
rootCommand.SetHandler((delayOptionValue, messageOptionValue) =>
{
Console.WriteLine($"--delay = {delayOptionValue}");
Console.WriteLine($"--message = {messageOptionValue}");
},
delayOption, messageOption);
Hier volgt een voorbeeld van opdrachtregelinvoer en de resulterende uitvoer voor de voorgaande voorbeeldcode:
myapp --delay 21 --message "Hello world!"
--delay = 21
--message = Hello world!
Algemene opties
Als u een optie aan één opdracht tegelijk wilt toevoegen, gebruikt u de Add
of AddOption
methode, zoals wordt weergegeven in het voorgaande voorbeeld. Als u een optie aan een opdracht wilt toevoegen en recursief wilt toevoegen aan alle subopdrachten, gebruikt u de AddGlobalOption
methode, zoals wordt weergegeven in het volgende voorbeeld:
var delayOption = new Option<int>
("--delay", "An option whose argument is parsed as an int.");
var messageOption = new Option<string>
("--message", "An option whose argument is parsed as a string.");
var rootCommand = new RootCommand();
rootCommand.AddGlobalOption(delayOption);
rootCommand.Add(messageOption);
var subCommand1 = new Command("sub1", "First level subcommand");
rootCommand.Add(subCommand1);
var subCommand1a = new Command("sub1a", "Second level subcommand");
subCommand1.Add(subCommand1a);
subCommand1a.SetHandler((delayOptionValue) =>
{
Console.WriteLine($"--delay = {delayOptionValue}");
},
delayOption);
await rootCommand.InvokeAsync(args);
De voorgaande code wordt --delay
toegevoegd als een globale optie aan de hoofdopdracht en is beschikbaar in de handler voor subCommand1a
.
Argumenten definiëren
Argumenten worden gedefinieerd en toegevoegd aan opdrachten zoals opties. Het volgende voorbeeld lijkt op het voorbeeld met opties, maar definieert argumenten in plaats van opties:
var delayArgument = new Argument<int>
(name: "delay",
description: "An argument that is parsed as an int.",
getDefaultValue: () => 42);
var messageArgument = new Argument<string>
("message", "An argument that is parsed as a string.");
var rootCommand = new RootCommand();
rootCommand.Add(delayArgument);
rootCommand.Add(messageArgument);
rootCommand.SetHandler((delayArgumentValue, messageArgumentValue) =>
{
Console.WriteLine($"<delay> argument = {delayArgumentValue}");
Console.WriteLine($"<message> argument = {messageArgumentValue}");
},
delayArgument, messageArgument);
await rootCommand.InvokeAsync(args);
Hier volgt een voorbeeld van opdrachtregelinvoer en de resulterende uitvoer voor de voorgaande voorbeeldcode:
myapp 42 "Hello world!"
<delay> argument = 42
<message> argument = Hello world!
Een argument dat is gedefinieerd zonder een standaardwaarde, zoals messageArgument
in het voorgaande voorbeeld, wordt behandeld als een vereist argument. Er wordt een foutbericht weergegeven en de opdrachthandler wordt niet aangeroepen als er geen vereist argument is opgegeven.
Aliassen definiëren
Zowel opdrachten als opties ondersteunen aliassen. U kunt een alias toevoegen aan een optie door het aanroepen van AddAlias
:
var option = new Option("--framework");
option.AddAlias("-f");
Op basis van deze alias zijn de volgende opdrachtregels equivalent:
myapp -f net6.0
myapp --framework net6.0
Opdrachtaliassen werken op dezelfde manier.
var command = new Command("serialize");
command.AddAlias("serialise");
Met deze code komen de volgende opdrachtregels overeen:
myapp serialize
myapp serialise
Het is raadzaam om het aantal optiealiassen dat u definieert te minimaliseren en om te voorkomen dat bepaalde aliassen in het bijzonder worden gedefinieerd. Zie Korte aliassen voor meer informatie.
Vereiste opties
Als u een optie vereist wilt maken, stelt u IsRequired
de eigenschap true
in op , zoals wordt weergegeven in het volgende voorbeeld:
var endpointOption = new Option<Uri>("--endpoint") { IsRequired = true };
var command = new RootCommand();
command.Add(endpointOption);
command.SetHandler((uri) =>
{
Console.WriteLine(uri?.GetType());
Console.WriteLine(uri?.ToString());
},
endpointOption);
await command.InvokeAsync(args);
In de sectie Opties van de Help-opdracht wordt aangegeven dat de optie is vereist:
Options:
--endpoint <uri> (REQUIRED)
--version Show version information
-?, -h, --help Show help and usage information
Als de opdrachtregel voor deze voorbeeld-app niet bevat --endpoint
, wordt er een foutbericht weergegeven en wordt de opdrachthandler niet aangeroepen:
Option '--endpoint' is required.
Als een vereiste optie een standaardwaarde heeft, hoeft de optie niet op de opdrachtregel te worden opgegeven. In dat geval biedt de standaardwaarde de vereiste optiewaarde.
Verborgen opdrachten, opties en argumenten
Mogelijk wilt u een opdracht, optie of argument ondersteunen, maar vermijdt u het gemakkelijk te detecteren. Het kan bijvoorbeeld een afgeschafte of beheer- of preview-functie zijn. Gebruik de IsHidden eigenschap om te voorkomen dat gebruikers dergelijke functies detecteren met behulp van tabvoltooiing of Help, zoals wordt weergegeven in het volgende voorbeeld:
var endpointOption = new Option<Uri>("--endpoint") { IsHidden = true };
var command = new RootCommand();
command.Add(endpointOption);
command.SetHandler((uri) =>
{
Console.WriteLine(uri?.GetType());
Console.WriteLine(uri?.ToString());
},
endpointOption);
await command.InvokeAsync(args);
In de sectie met opties van de opdracht van dit voorbeeld wordt de --endpoint
optie weggelaten.
Options:
--version Show version information
-?, -h, --help Show help and usage information
Argument arity instellen
U kunt expliciet argument arity instellen met behulp van de eigenschap, maar in de Arity
meeste gevallen is dat niet nodig. System.CommandLine
bepaalt automatisch de argument arity op basis van het argumenttype:
Argumenttype | Standaard arity |
---|---|
Boolean |
ArgumentArity.ZeroOrOne |
Verzamelingstypen | ArgumentArity.ZeroOrMore |
Alles | ArgumentArity.ExactlyOne |
Meerdere argumenten
Wanneer u een opdracht aanroept, kunt u standaard een optienaam herhalen om meerdere argumenten op te geven voor een optie met een maximale arity groter dan één.
myapp --items one --items two --items three
Als u meerdere argumenten wilt toestaan zonder de optienaam te herhalen, stelt u deze in Option.AllowMultipleArgumentsPerToken op true
. Met deze instelling kunt u de volgende opdrachtregel invoeren.
myapp --items one two three
Dezelfde instelling heeft een ander effect als het maximumargument 1 is. Hiermee kunt u een optie herhalen, maar alleen de laatste waarde op de regel gebruiken. In het volgende voorbeeld wordt de waarde three
doorgegeven aan de app.
myapp --item one --item two --item three
Geldige argumentwaarden weergeven
Als u een lijst met geldige waarden voor een optie of argument wilt opgeven, geeft u een opsomming op als het optietype of het gebruik FromAmong, zoals wordt weergegeven in het volgende voorbeeld:
var languageOption = new Option<string>(
"--language",
"An option that that must be one of the values of a static list.")
.FromAmong(
"csharp",
"fsharp",
"vb",
"pwsh",
"sql");
Hier volgt een voorbeeld van opdrachtregelinvoer en de resulterende uitvoer voor de voorgaande voorbeeldcode:
myapp --language not-a-language
Argument 'not-a-language' not recognized. Must be one of:
'csharp'
'fsharp'
'vb'
'pwsh'
'sql'
In de sectie Opties van de Help van de opdracht worden de geldige waarden weergegeven:
Options:
--language <csharp|fsharp|vb|pwsh|sql> An option that must be one of the values of a static list.
--version Show version information
-?, -h, --help Show help and usage information
Validatie van opties en argumenten
Zie de volgende secties in het artikel Parameterbinding voor informatie over argumentvalidatie en het aanpassen ervan: