ManyConsole – pomysł na console application prosto z Nuget

Czasami zdarza się, że musimy dopisać do systemu prostego konsolowego tool’a pozwalającego na wykonanie kilku wybranych funkcjonalności. Czy to jakiś prosty raport tekstowy, sprawdzenie stanu, cokolwiek. Bywa, że z dumą przystępujemy do pisania „od zera”. Czasami mamy już swoje wypracowane rozwiązanie, a czasem ruszamy na poszukiwania. Tym szukającym właśnie wychodzi naprzeciw ManyConsole.

ManyConsole to biblioteka dostępna na nuget pozwalająca w prosty sposób rozwijać i zarządzać aplikacją konsolową. Używa i zależy od parsera NDesk.Options z tym, że główną wartością dodaną jest obsługa wielu komend z różnymi parametrami do czego przyzwyczaił nas git. Automatyczny help jest już wisienką na torcie:).

Zgodnie z instrukcją z GitHub aby użyć wystarczy:

  1. Dodać bibliotekę z nuget
  2. W main wywołać ConsoleCommandDispatcher
  3. Dodać wymagane komendy jako klasy dziedziczące z ConsoleCommand

Wystarczy zerknąć na przykładowy kod żeby zrozumieć co i jak.
W samym main w bazowej implementacji wystarczy nam tylko:

class Program
{
    class Program
    {
        static int Main(string[] args)
        {
            // locate any commands in the assembly (or use an IoC container, or whatever source)
            var commands = GetCommands();

            // then run them.
            return ConsoleCommandDispatcher.DispatchCommand(commands, args, Console.Out);
        }

        public static IEnumerable<ConsoleCommand> GetCommands()
        {
            return ConsoleCommandDispatcher.FindCommandsInSameAssemblyAs(typeof(Program));
        }
    }
}

Mamy więc ConsoleCommandDispatcher dzielnie poszukujący komend w Assembly.
Implementacja przykładowej komendy wygląda następująco:

    public class ExampleCommand : ConsoleCommand
    {
        public ExampleCommand()
        {
            this.IsCommand("Example", "Example implementation of a ManyConsole command-line argument parser Command");

            this.HasOption("b|booleanOption", "Boolean flag option", b => BooleanOption = true);

            //  Setting .Options directly is the old way to do this, you may prefer to call the helper
            //  method HasOption/HasRequiredOption.
            Options = new OptionSet()
            {
                {"l|list=", "Values to add to list", v => OptionalArgumentList.Add(v)},
                {"r|requiredArguments=", "Optional string argument requiring a value be specified afterwards", s => OptionalArgument1 = s},
                {"o|optionalArgument:", "Optional String argument which is null if no value follow is specified", s => OptionalArgument2 = s ?? "<no argument specified>"}
            };

            this.HasRequiredOption("requiredOption=", "Required string argument also requiring a value.", s => { });
            this.HasOption("anotherOptional=", "Another way to specify optional arguments", s => {});

            HasAdditionalArguments(2, "<Argument1> <Argument2>");
        }

        public string Argument1;
        public string Argument2;
        public string OptionalArgument1;
        public string OptionalArgument2;
        public bool BooleanOption;
        public List<string> OptionalArgumentList = new List<string>();

        public override int Run(string[] remainingArguments)
        {
            Argument1 = remainingArguments[0];
            Argument2 = remainingArguments[1];

            Console.WriteLine(@"Called Example command - Argument1 = ""{0}"" Argument2 = ""{1}"" BooleanOption: {2}", Argument1, Argument2, BooleanOption);

            OptionalArgumentList.ForEach((item) => Console.WriteLine(@"List Item {0} = ""{1}""", OptionalArgumentList.IndexOf(item), item));

            if (BooleanOption)
            {
                throw new Exception("Throwing unhandled exception because BooleanOption is true");
            }

            return 0;
        }
    }

Mam nadzieję, że tym krótkim wpisem zachęcę kogoś do wypróbowania ManyConsole albo przynajmniej zaznaczę obecność tej biblioteki w świadomości użytkowników nuget.

Napisano w .net, Nuget Tagi: , , ,