Megosztás a következőn keresztül:


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 rootCommandutá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!

Lásd még

System.CommandLine Áttekintés