Köztes szoftver használata System.CommandLine
Fontos
System.CommandLine
jelenleg előzetes verzióban érhető el, és ez a dokumentáció a 2.0-s bétaverzió 4-es verziójához készült.
Egyes információk az előzetes termékre vonatkoznak, amelyek a kiadás előtt jelentősen módosíthatók. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
Ez a cikk azt ismerteti, hogyan használható köztes szoftverekkel a System.CommandLine
könyvtárral készült parancssori alkalmazásokban. A köztes szoftver használata olyan speciális témakör, amelyet a legtöbb System.CommandLine
felhasználónak nem kell figyelembe vennie.
Bevezetés a köztes szoftver használatába
Bár minden parancs rendelkezik egy kezelővel, amely System.CommandLine
a bemenet alapján fog haladni, az alkalmazáslogika meghívása előtt van egy rövidzárolási vagy módosítási mechanizmus is. Az elemzés és a meghívás között van egy felelősségi lánc, amelyet testre szabhat. Ennek a funkciónak számos beépített funkciója System.CommandLine
van. Így történik a --help
--version
rövidzárlatok hívása a kezelőhöz.
A folyamat minden hívása a folyamat alapján műveletet hajthat végre, ParseResult és korán visszatérhet, vagy a folyamat következő elemének meghívását választhatja. Ebben ParseResult
a fázisban akár lecserélhető is. A lánc utolsó hívása a megadott parancs kezelője.
Hozzáadás a köztes szoftverfolyamathoz
Ehhez a folyamathoz CommandLineBuilderExtensions.AddMiddlewarehívással adhat hozzá hívást. Íme egy példa az egyéni irányelveket engedélyező kódra. A gyökérparancs létrehozása rootCommand
után a kód a szokásos módon hozzáadja a beállításokat, az argumentumokat és a kezelőket. Ezután hozzáadja a köztes szoftvert:
var commandLineBuilder = new CommandLineBuilder(rootCommand);
commandLineBuilder.AddMiddleware(async (context, next) =>
{
if (context.ParseResult.Directives.Contains("just-say-hi"))
{
context.Console.WriteLine("Hi!");
}
else
{
await next(context);
}
});
commandLineBuilder.UseDefaults();
var parser = commandLineBuilder.Build();
await parser.InvokeAsync(args);
Az előző kódban a köztes szoftver a "Szia!" szöveget írja ki, ha az irányelv [just-say-hi]
megtalálható az elemzés eredményében. Ha ez történik, a parancs normál kezelője nem lesz meghívva. Ez nem hívható meg, mert a köztes szoftver nem hívja meg a meghatalmazottat next
.
A példában context
egy InvocationContextönálló struktúra, amely a teljes parancskezelési folyamat "gyökere". A képességek szempontjából ez a legerősebb struktúra System.CommandLine
. A köztes szoftverben két fő felhasználási módja van:
- Hozzáférést biztosít a , , Parser, Consoleés HelpBuilder lekérheti azokat a BindingContextfüggőségeket, amelyeket a köztes szoftver igényel az egyéni logikájához.
- A parancsfeldolgozás rövidzárolással történő leállításához beállíthatja a InvocationResult tulajdonságokat vagy ExitCode a tulajdonságokat. Ilyen például a
--help
lehetőség, amely így van implementálva.
Itt van a teljes program, beleértve a szükséges using
irányelveket.
using System.CommandLine;
using System.CommandLine.Builder;
using System.CommandLine.Parsing;
class Program
{
static async Task Main(string[] args)
{
var delayOption = new Option<int>("--delay");
var messageOption = new Option<string>("--message");
var rootCommand = new RootCommand("Middleware example");
rootCommand.Add(delayOption);
rootCommand.Add(messageOption);
rootCommand.SetHandler((delayOptionValue, messageOptionValue) =>
{
DoRootCommand(delayOptionValue, messageOptionValue);
},
delayOption, messageOption);
var commandLineBuilder = new CommandLineBuilder(rootCommand);
commandLineBuilder.AddMiddleware(async (context, next) =>
{
if (context.ParseResult.Directives.Contains("just-say-hi"))
{
context.Console.WriteLine("Hi!");
}
else
{
await next(context);
}
});
commandLineBuilder.UseDefaults();
var parser = commandLineBuilder.Build();
await parser.InvokeAsync(args);
}
public static void DoRootCommand(int delay, string message)
{
Console.WriteLine($"--delay = {delay}");
Console.WriteLine($"--message = {message}");
}
}
Íme egy példa parancssor és az előző kód kimenete:
myapp [just-say-hi] --delay 42 --message "Hello world!"
Hi!