Upstream.CommandLine
2.1.0
See the version list below for details.
dotnet add package Upstream.CommandLine --version 2.1.0
NuGet\Install-Package Upstream.CommandLine -Version 2.1.0
<PackageReference Include="Upstream.CommandLine" Version="2.1.0" />
paket add Upstream.CommandLine --version 2.1.0
#r "nuget: Upstream.CommandLine, 2.1.0"
// Install Upstream.CommandLine as a Cake Addin #addin nuget:?package=Upstream.CommandLine&version=2.1.0 // Install Upstream.CommandLine as a Cake Tool #tool nuget:?package=Upstream.CommandLine&version=2.1.0
upstream-command-line
A wrapper around System.CommandLine
to allow for large, service-oriented application development. Some of the benefits
of this package include:
- Native IOC support: All commands are registered and instantiated via the ServiceProvider .
- Attribute-based command declaration: Commands can be configured via readable, statically typed classes—no more mapping classes to functional configuration methods.
- Leverage System.CommandLine: This is not a fork, but a flexible wrapper around the .NET Foundation
sponsored System.CommandLine library. This means that your application
will benefit from the continued development/maturity of that project, and can benefit from integrations
like
dotnet-suggest
out of the box. If you wish to switch to a vanilla System.CommandLine implementation down the road, the migration is straightforward.
Setup
Add the package as a dependency to your .NET project via the following command:
dotnet add package Upstream.CommandLine
Usage
Refer to the Sample project for a working example of this package. The following is a simple (non-functional) example of how to configure an Upstream.CommandLine console application that uses dependency injected services, command groups, middleware, and exception handling:
public static class Program
{
public static Task Main(string[] args)
{
return new CommandLineApplication()
.AddCommand<FooCommandHandler, FooCommand>()
.AddCommandGroup("gizmo", builder =>
{
builder.AddCommand<GadgetCommandHandler, GadgetCommand>();
})
.AddMiddleware<GreetMiddleware>()
.ConfigureServices(services =>
{
services.AddSingleton<IBarService, BarService>();
})
.UseExceptionHandler(e =>
{
Console.WriteLine($"An exception occured: {e.Message}");
})
.InvokeAsync(args);
}
}
Commands
A command is a class-based representation of the arguments, options, and other tokens that make up a set of command line
instructions. Commands are defined by properties decorated with the [Command]
, [Argument]
, and/or [Options]
attributes.
Example:
[Command("foo")]
public class FooCommand
{
[Argument(Description = "Drink order at the Bar")]
public Drink Drink { get; set; }
[Option("-n", "--name")]
public string Name { get; set; }
[Option("-d", "--double")]
public bool Double { get; set; }
}
public enum Drink
{
Whiskey,
Wine,
Beer,
}
This following command invocation and class initialization are equivalent:
> foo beer -n Homer --double
new FooCommand
{
Drink = Drink.Beer,
Name = "Homer",
Double = true,
}
Command Groups
Command groups are a feature that allows nested subcommands. The following configuration would enable the subsequent command:
new CommandLineApplication()
.AddCommandGroup("foo", builder =>
{
builder.AddCommandGroup("bar", builder =>
{
builder.AddCommandGroup<BazCommandHandler, BazCommand>();
});
});
> foo bar baz
Command Handlers
A command handler is a class that implements ICommandHandler
and defines the execution of a command.
Command handlers are instantiated via dependency injection to enable IoC patterns while developing your command line
application.
An ICommandHandler
must return an integer representing the exit code of the command. A 0
typically indicates a
successful execution, while any other integer indicates an unsuccessful execution.
Example:
public class FooCommandHandler : CommandHandler<FooCommand>
{
private readonly IBarService _barService;
public FooCommand(IBarService barService)
{
_barService = barService;
}
protected override async Task<int> ExecuteAsync(FooCommand command,
CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
Console.WriteLine($"{command.Name} walks into a Bar and orders a {command.Drink}");
await _barService.OrderAsync(command.Drink);
return 0;
}
}
Middleware
Middleware can be added to the application pipeline to validate or alter a command. For more information, please refer to the System.CommandLine Middleware Documentation .
Example:
public class GreetMiddleware : ICommandMiddleware
{
public async Task InvokeAsync(InvocationContext context
Func<InvocationContext, Task> next)
{
Console.WriteLine("Hello!");
await next(context);
Console.WriteLine("Goodbye!");
}
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- Microsoft.Extensions.DependencyInjection (>= 6.0.0)
- System.CommandLine (>= 2.0.0-beta4.22272.1)
- System.CommandLine.NamingConventionBinder (>= 2.0.0-beta4.22272.1)
-
net6.0
- Microsoft.Extensions.DependencyInjection (>= 6.0.0)
- System.CommandLine (>= 2.0.0-beta4.22272.1)
- System.CommandLine.NamingConventionBinder (>= 2.0.0-beta4.22272.1)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
2.2.1 | 244 | 10/20/2023 |
2.1.0 | 390 | 11/18/2022 |
2.0.1 | 106 | 10/31/2022 |
2.0.0 | 719 | 5/17/2022 |
2.0.0-beta3 | 127 | 5/16/2022 |
2.0.0-beta2 | 122 | 5/13/2022 |
2.0.0-beta1 | 116 | 5/12/2022 |
2.0.0-alpha | 120 | 5/1/2022 |
1.2.2 | 153 | 4/14/2022 |
1.2.1 | 163 | 4/14/2022 |
1.2.0 | 219 | 4/29/2021 |
1.1.0 | 342 | 1/30/2020 |
1.1.0-alpha1 | 307 | 1/30/2020 |
1.0.0 | 340 | 1/6/2020 |