DeclarativeCommandLine 2.0.0-g29ba6a745e
This is a prerelease version of DeclarativeCommandLine.
There is a newer prerelease version of this package available.
See the version list below for details.
See the version list below for details.
dotnet add package DeclarativeCommandLine --version 2.0.0-g29ba6a745e
NuGet\Install-Package DeclarativeCommandLine -Version 2.0.0-g29ba6a745e
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="DeclarativeCommandLine" Version="2.0.0-g29ba6a745e" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="DeclarativeCommandLine" Version="2.0.0-g29ba6a745e" />
<PackageReference Include="DeclarativeCommandLine" />
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add DeclarativeCommandLine --version 2.0.0-g29ba6a745e
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: DeclarativeCommandLine, 2.0.0-g29ba6a745e"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package DeclarativeCommandLine@2.0.0-g29ba6a745e
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=DeclarativeCommandLine&version=2.0.0-g29ba6a745e&prerelease
#tool nuget:?package=DeclarativeCommandLine&version=2.0.0-g29ba6a745e&prerelease
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
Declarative Command Line
Attribute-driven layer on top of System.CommandLine to make the most common use cases easier to set up.
Minimalistic Example
A minimal example, using DI to instantiate command objects:
Add NuGet Packages
<ItemGroup>
<PackageReference Include="DeclarativeCommandLine" Version="2.0.0-g498c5dd86c" />
<PackageReference Include="DeclarativeCommandLine.Generator" Version="2.0.0-g498c5dd86c" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.9"/>
</ItemGroup>
Program.cs
using DeclarativeCommandLine;
using Microsoft.Extensions.DependencyInjection;
namespace MyApp;
[Command(Description = "Math commands")]
public class AppRootCommand
{
}
[Command(Description = "Add 2 numbers", Parent = typeof(AppRootCommand))]
public class AddCommand : ICommand
{
[Option(Required = true)]
public int ValueA { get; set; }
[Option(Required = true)]
public int ValueB { get; set; }
public void Execute()
{
Console.WriteLine($"A={ValueA} + {ValueB} = {ValueA + ValueB}");
}
}
public static class Program
{
public static int Main(string[] args)
{
var p = new ServiceCollection()
.AddTransient<AppRootCommand>()
.AddTransient<AddCommand>()
.BuildServiceProvider();
return new CommandBuilder()
.Build(t => p.GetRequiredService(t))
.Parse(args)
.Invoke();
}
}
Result
$ ./myapp
Required command was not provided.
Description:
Usage:
myapp [command] [options]
Options:
-?, -h, --help Show help and usage information
--version Show version information
Commands:
add
$ ./myapp add
Option '--value-a' is required.
Option '--value-b' is required.
Description:
Usage:
myapp add [options]
Options:
--value-a <value-a> (REQUIRED)
--value-b <value-b> (REQUIRED)
-?, -h, --help Show help and usage information
$ ./myapp add --value-a 20 --value-b 22
A=20 + 22 = 42
Generated
This is what the source generator has written, based on the attribute-annotated classes:
/// <auto-generated/>
using DeclarativeCommandLine;
using System;
using System.CommandLine;
namespace MyApp
{
public partial class CommandBuilder
{
public virtual RootCommand Build(Func<Type, object> serviceProvider)
{
var cmd1 = new RootCommand();
cmd1.Hidden = false;
// global::MyApp.AddCommand
{
var cmd2 = new Command("add");
cmd1.Add(cmd2);
cmd2.Hidden = false;
// Option --value-a
var opt3 = new Option<Int32>("--value-a");
{
cmd2.Add(opt3);
opt3.Description = "";
opt3.Hidden = false;
opt3.Required = true;
}
// Option --value-b
var opt4 = new Option<Int32>("--value-b");
{
cmd2.Add(opt4);
opt4.Description = "";
opt4.Hidden = false;
opt4.Required = true;
}
cmd2.SetAction(async (parseResult, ct) =>
{
var cmd2Inst = (global::MyApp.AddCommand)serviceProvider(typeof(global::MyApp.AddCommand));
cmd2Inst.ValueA = parseResult.GetValue(opt3);
cmd2Inst.ValueB = parseResult.GetValue(opt4);
if (cmd2Inst is IAsyncCommandWithParseResult cmd2001)
{
await cmd2001.ExecuteAsync(parseResult, ct).ConfigureAwait(false);
}
if (cmd2Inst is IAsyncCommand cmd2002)
{
await cmd2002.ExecuteAsync(ct).ConfigureAwait(false);
}
if (cmd2Inst is ICommand cmd2003)
{
cmd2003.Execute();
}
});
}
return cmd1;
}
}
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. 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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.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. |
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- System.CommandLine (>= 2.0.0-rc.1.25451.107)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories (1)
Showing the top 1 popular GitHub repositories that depend on DeclarativeCommandLine:
Repository | Stars |
---|---|
flyingpie/windows-terminal-quake
Enable Quake-style dropdown for (almost) any application.
|
2.0.0 Refactor to use a source generator
1.0.0 Initial release