Aracılığıyla paylaş


'da ara yazılım kullanma System.CommandLine

Önemli

System.CommandLine şu anda ÖNİzLEME aşamasındadır ve bu belgeler 2.0 beta 4 sürümüne yöneliktir. Bazı bilgiler, yayımlanmadan önce önemli ölçüde değiştirilebilen yayın öncesi ürünle ilgilidir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.

Bu makalede, kitaplıkla oluşturulan komut satırı uygulamalarında ara yazılımla System.CommandLine nasıl çalışılır açıklanmaktadır. Ara yazılım kullanımı, kullanıcıların çoğunun System.CommandLine dikkate almaları gerekmeyen gelişmiş bir konudur.

Ara yazılıma giriş

Her komutun System.CommandLine girişe göre yönlendirilecek bir işleyicisi olsa da, uygulama mantığınız çağrılmadan önce girişin kısa devresi veya değiştirilmesine yönelik bir mekanizma da vardır. Ayrıştırma ve çağırma arasında özelleştirebileceğiniz bir sorumluluk zinciri vardır. Bu özelliği kullanmanın bir dizi yerleşik özelliği System.CommandLine . ve --version seçenekleri kısa devre işleyicinize bu şekilde --help çağrır.

İşlem hattındaki her çağrı, öğesine göre ParseResult eylem gerçekleştirebilir ve erken dönebilir veya işlem hattında bir sonraki öğeyi çağırmayı seçebilir. ParseResult bu aşamada değiştirilebilir. Zincirdeki son çağrı, belirtilen komutun işleyicisidir.

Ara yazılım işlem hattına ekleme

çağrısı yaparak bu işlem hattına bir çağrı CommandLineBuilderExtensions.AddMiddlewareekleyebilirsiniz. Aşağıda özel yönergeyi etkinleştiren bir kod örneği verilmiştir. adlı rootCommandbir kök komutu oluşturduktan sonra, her zamanki gibi kod seçenekler, bağımsız değişkenler ve işleyiciler ekler. Ardından ara yazılım eklenir:

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);

Yukarıdaki kodda, yönerge [just-say-hi] ayrıştırma sonucunda bulunursa ara yazılım "Merhaba!" yazar. Bu durumda, komutun normal işleyicisi çağrılmıyor. Ara yazılım temsilciyi next çağırmadığından çağrılmıyor.

Örnekte, context tüm komut işleme işleminin "kökü" olarak görev yapan tekil bir yapıdır InvocationContext. Bu, özellikleri açısından içindeki System.CommandLineen güçlü yapıdır. Ara yazılımda bunun için iki ana kullanım vardır:

  • Bir ara yazılımının BindingContextözel mantığı için gerektirdiği bağımlılıkları almak için , Parser, Consoleve HelpBuilder öğesine erişim sağlar.
  • Komut işlemeyi InvocationResult kısa devreli bir şekilde sonlandırmak için veya ExitCode özelliklerini ayarlayabilirsiniz. Bu şekilde uygulanan seçenek bir örnektir --help .

Gerekli using yönergeler de dahil olmak üzere programın tamamı aşağıda verilmiştir.

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}");
    }
}

Aşağıda örnek bir komut satırı ve önceki koddan elde edilen çıkış verilmişti:

myapp [just-say-hi] --delay 42 --message "Hello world!"
Hi!

Ayrıca bkz.

System.CommandLine Genel bakış