Cara menentukan perintah, opsi, dan argumen di System.CommandLine
Penting
System.CommandLine
saat ini dalam PRATINJAU, dan dokumentasi ini untuk versi 2.0 beta 4.
Beberapa informasi terkait produk prarilis yang dapat diubah secara signifikan sebelum dirilis. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.
Artikel ini menjelaskan cara menentukan perintah, opsi, dan argumen dalam aplikasi baris perintah yang dibangun dengan System.CommandLine
pustaka. Untuk membangun aplikasi lengkap yang mengilustrasikan teknik ini, lihat tutorial Mulai menggunakan System.CommandLine.
Untuk panduan tentang cara mendesain perintah, opsi, dan argumen aplikasi baris perintah, lihat Panduan desain.
Menentukan perintah akar
Setiap aplikasi baris perintah memiliki perintah root, yang mengacu pada file yang dapat dieksekusi itu sendiri. Kasus paling sederhana untuk memanggil kode Anda, jika Anda memiliki aplikasi tanpa subperintah, opsi, atau argumen, akan terlihat seperti ini:
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);
}
}
Menentukan sub-perintah
Perintah dapat memiliki perintah turunan, yang dikenal sebagai subperintah atau kata kerja, dan dapat menumpuk tingkat sebanyak yang Anda butuhkan. Anda dapat menambahkan subperintah, seperti yang ditunjukkan dalam contoh berikut:
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);
Sub perintah terdalam dalam contoh ini dapat dipanggil seperti ini:
myapp sub1 sub1a
Menentukan opsi
Metode handler perintah biasanya memiliki parameter, dan nilainya dapat berasal dari opsi baris perintah. Contoh berikut membuat dua opsi dan menambahkannya ke perintah root. Nama opsi mencakup awalan tanda hubung ganda, yang khas untuk POSIX CLIs. Kode handler perintah menampilkan nilai opsi tersebut:
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);
Berikut adalah contoh input baris perintah dan output yang dihasilkan untuk kode contoh sebelumnya:
myapp --delay 21 --message "Hello world!"
--delay = 21
--message = Hello world!
Opsi global
Untuk menambahkan opsi ke satu perintah sekaligus, gunakan metode Add
atau AddOption
seperti yang ditunjukkan dalam contoh sebelumnya. Untuk menambahkan opsi ke perintah dan secara rekursif ke semua sub-perintahnya, gunakan AddGlobalOption
metode, seperti yang ditunjukkan dalam contoh berikut:
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);
Kode sebelumnya ditambahkan --delay
sebagai opsi global ke perintah root, dan tersedia di handler untuk subCommand1a
.
Menentukan argumen
Argumen ditentukan dan ditambahkan ke perintah seperti opsi. Contoh berikut seperti contoh opsi, tetapi mendefinisikan argumen alih-alih opsi:
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);
Berikut adalah contoh input baris perintah dan output yang dihasilkan untuk kode contoh sebelumnya:
myapp 42 "Hello world!"
<delay> argument = 42
<message> argument = Hello world!
Argumen yang didefinisikan tanpa nilai default, seperti messageArgument
dalam contoh sebelumnya, diperlakukan sebagai argumen yang diperlukan. Pesan kesalahan ditampilkan, dan handler perintah tidak dipanggil, jika argumen yang diperlukan tidak disediakan.
Menentukan alias
Baik perintah maupun opsi mendukung alias. Anda dapat menambahkan alias ke opsi dengan memanggil AddAlias
:
var option = new Option("--framework");
option.AddAlias("-f");
Misalnya, baris perintah berikut ini setara:
myapp -f net6.0
myapp --framework net6.0
Alias perintah bekerja dengan cara yang sama.
var command = new Command("serialize");
command.AddAlias("serialise");
Kode ini membuat baris perintah berikut setara:
myapp serialize
myapp serialise
Kami menyarankan agar Anda meminimalkan jumlah alias opsi yang Anda tentukan, dan hindari menentukan alias tertentu secara khusus. Untuk informasi selengkapnya, lihat Alias bentuk pendek.
Opsi yang diperlukan
Untuk membuat opsi diperlukan, atur propertinya IsRequired
ke true
, seperti yang ditunjukkan dalam contoh berikut:
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);
Bagian opsi dari perintah membantu menunjukkan opsi diperlukan:
Options:
--endpoint <uri> (REQUIRED)
--version Show version information
-?, -h, --help Show help and usage information
Jika baris perintah untuk aplikasi contoh ini tidak menyertakan --endpoint
, pesan kesalahan ditampilkan dan penangan perintah tidak dipanggil:
Option '--endpoint' is required.
Jika opsi yang diperlukan memiliki nilai default, opsi tidak harus ditentukan pada baris perintah. Dalam hal ini, nilai default menyediakan nilai opsi yang diperlukan.
Perintah, opsi, dan argumen tersembunyi
Anda mungkin ingin mendukung perintah, opsi, atau argumen, tetapi hindari membuatnya mudah ditemukan. Misalnya, ini mungkin fitur yang tidak digunakan lagi atau administratif atau pratinjau. Gunakan IsHidden properti untuk mencegah pengguna menemukan fitur tersebut dengan menggunakan penyelesaian atau bantuan tab, seperti yang ditunjukkan dalam contoh berikut:
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);
Bagian opsi dari perintah contoh ini membantu menghilangkan --endpoint
opsi.
Options:
--version Show version information
-?, -h, --help Show help and usage information
Atur aritas argumen
Anda dapat mengatur secara eksplisit aritas argumen dengan menggunakan Arity
properti, tetapi dalam banyak kasus yang tidak diperlukan. System.CommandLine
secara otomatis menentukan aritas argumen berdasarkan jenis argumen:
Jenis Argumen | Aritas default |
---|---|
Boolean |
ArgumentArity.ZeroOrOne |
Tipe koleksi | ArgumentArity.ZeroOrMore |
Segala sesuatu yang lain | ArgumentArity.ExactlyOne |
Beberapa argumen
Secara default, saat Anda memanggil perintah, Anda dapat mengulangi nama opsi untuk menentukan beberapa argumen untuk opsi yang memiliki aritas maksimum lebih besar dari satu.
myapp --items one --items two --items three
Untuk mengizinkan beberapa argumen tanpa mengulangi nama opsi, atur Option.AllowMultipleArgumentsPerToken ke true
. Pengaturan ini memungkinkan Anda memasukkan baris perintah berikut.
myapp --items one two three
Pengaturan yang sama memiliki efek yang berbeda jika aritas argumen maksimum adalah 1. Ini memungkinkan Anda untuk mengulangi opsi tetapi hanya mengambil nilai terakhir pada baris. Dalam contoh berikut, nilai three
akan diteruskan ke perintah.
myapp --item one --item two --item three
Mencantumkan nilai argumen yang valid
Untuk menentukan daftar nilai yang valid untuk opsi atau argumen, tentukan enum sebagai jenis opsi atau gunakan FromAmong, seperti yang ditunjukkan dalam contoh berikut:
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");
Berikut adalah contoh input baris perintah dan output yang dihasilkan untuk kode contoh sebelumnya:
myapp --language not-a-language
Argument 'not-a-language' not recognized. Must be one of:
'csharp'
'fsharp'
'vb'
'pwsh'
'sql'
Bagian opsi dari perintah membantu memperlihatkan nilai yang valid:
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
Validasi opsi dan argumen
Untuk informasi tentang validasi argumen dan cara menyesuaikannya, lihat bagian berikut dalam artikel Pengikatan parameter: