'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ı rootCommand
bir 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.CommandLine
en 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!