Tenho dificuldades em entender como o System.CommandLine funciona e preparei um pequeno violino .Net para demonstrar meu problema.
Estou tentando criar um aplicativo de console C#, que seria chamado com --nodes
a opção e receberia um ou mais IDs numéricos:
public static async Task Main(string[] args)
{
Option<long[]> nodesOption = new("-n", "--nodes")
{
Arity = ArgumentArity.OneOrMore,
Description = "Numerical node ids",
IsRequired = true,
};
RootCommand rootCommand = new("A test app for saving node ids");
rootCommand.AddGlobalOption(nodesOption);
await rootCommand.InvokeAsync(args);
Console.WriteLine("Why is this line printed?");
}
Quando chamo o código acima sem especificar nenhuma opção, ele imprime o aviso Option '-n' is required.
, mas a execução não é abortada.
O aplicativo não deveria sair com o código 1 quando uma isRequired
opção global estiver faltando?
Caso contrário, como posso alterar o comportamento do aplicativo para sair com o código 1?
E também me pergunto como especificar a new[] { 1234567890 }
como valor padrão para a opção, não consigo encontrá-lo no documento System.CommandLine .
Abaixo está uma captura de tela do meu caso de teste e sua saída:
Sim, a execução de um comando não deve encerrar todo o aplicativo, isso ocorre por design do conjunto de ferramentas de linha de comando.
Agora, para a detecção. O
rootCommand.InvokeAsync
método retornaria um resultado diferente de zero se não fosse concluído com sucesso. Então, no seu caso, basta verificar a saída:Quanto ao valor padrão, há na verdade uma sobrecarga que permite especificar um delegado que, por sua vez, deve fornecer valores padrão se nenhum for inserido pelo usuário: