Introduction
This article presents how simple it is to create CLI/Command-line tools using C# with .Net 5.0.
The concept used in this article helps the developers to focus only on their business needs rather than thinking about how to get the parameters, how to parse them and map with methods etc.
Prerequisites
Table of Contents
- Creating .Net Core Console application.
- Adding CommandLineTool Nuget to the application reference.
- Implementing Class and the method attribute for the CLI class.
- Running the tool and testing.
- Conclusion
Creating .Net Core Console application
Open the Visual Studio and search for Console App. Click on the Next button,
Define the project name, path, and solution name. Click on the Next button,
Choose the Framework and Click on Create,
Adding CommandLineTool Nuget to the application reference
Right-click on the project and click on "Manage Nuget Packages". Search for "CommandLineTool" in browse tab.
Implementing Class and the method attribute for the CLI class
Add a new class to the project like below,
using CommandLineTool.Attributes;
using System;
using System.Collections.Generic;
using System.IO;
namespace CLISample
{
[App("my application")]
public class MyCli
{
/// <summary>
/// Private static method Example
/// </summary>
/// <param name="v">simple string</param>
[Command("privateprint", "Private static command")]
private static void PrivatePrint(
[ParamArgument()] string v) => Console.WriteLine($"type: {v.GetType()}, {v}");
/// <summary>
/// public method sample
/// </summary>
/// <param name="v"></param>
[Command("publicprint", "public method command")]
public void PublicPrint(
[ParamArgument()] string v)
=> Console.WriteLine($"type: {v.GetType()}, {v}");
/// <summary>
/// List of string as Arguments
/// Ex: lst val1 val2 -> List<string>{val1,val2}
/// </summary>
/// <param name="lst"></param>
[Command("listprint", "mapping arguments with list")]
public void Listprint(
[ParamArgument()] List<string> lst)
=> lst.ForEach(v => Console.WriteLine($"type: {v.GetType()}, {v}"));
/// <summary>
/// get custom object list
/// Ex: files <file1_path> <file2_path> -> List<FileInfo>{file1_path,file2_path}
/// </summary>
/// <param name="lst"></param>
[Command("files", "mapping arguments with complex type arguments")]
public void MethodFiles(
[ParamArgument()] List<FileInfo> lst)
=> lst.ForEach(v => Console.WriteLine($"type: {v.GetType()}, {v.FullName}"));
/// <summary>
/// option sample
/// Ex: files <file1_path> <file2_path> -> List<FileInfo>{file1_path,file2_path}
/// </summary>
/// <param name="lst"></param>
[Command("options", "using options")]
public void MethodOptions(
[ParamArgument()] string v, [ParamOption("-a")] string op1)
{
Console.WriteLine($"type: {v.GetType()}, {v}");
Console.WriteLine($"type: {op1.GetType()}, {op1}");
}
}
}
Instantiate the class in Program.cs,
using CommandLineTool;
using System;
namespace CLISample
{
class Program
{
static void Main(string[] args)
{
Cli cli = new(typeof(MyCli))
{
Introduction = "my intro",
PromptText = "CLI"
};
//optional: set list of keys to exit from the command loop
cli.SetCancellationKeys(new() { "exit" });
cli.Start();
}
}
}
Running the tool and testing
Run the application the console will be launched with the title and the intro given by you.
Test commands like below in the console,
Conclusion
Thank you for reading, please let me know your questions, thoughts, or feedback in the comments section. I appreciate your feedback and encouragement.
Keep learning....!
I'm sharing the project source which has more samples and code.