mirror of
				https://github.com/nsnail/spectre.console.git
				synced 2025-11-04 02:25:28 +08:00 
			
		
		
		
	Add Spectre.Cli to Spectre.Console
* Renames Spectre.Cli to Spectre.Console.Cli. * Now uses Verify with Spectre.Console.Cli tests. * Removes some duplicate definitions. Closes #168
This commit is contained in:
		
				
					committed by
					
						
						Patrik Svensson
					
				
			
			
				
	
			
			
			
						parent
						
							0bbf9b81a9
						
					
				
				
					commit
					0ae419326d
				
			
							
								
								
									
										47
									
								
								examples/Cli/Demo/Commands/Add/AddPackageCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								examples/Cli/Demo/Commands/Add/AddPackageCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using Demo.Utilities;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Demo.Commands
 | 
			
		||||
{
 | 
			
		||||
    [Description("Add a NuGet package reference to the project.")]
 | 
			
		||||
    public sealed class AddPackageCommand : Command<AddPackageCommand.Settings>
 | 
			
		||||
    {
 | 
			
		||||
        public sealed class Settings : AddSettings
 | 
			
		||||
        {
 | 
			
		||||
            [CommandArgument(0, "<PACKAGENAME>")]
 | 
			
		||||
            [Description("The package reference to add.")]
 | 
			
		||||
            public string PackageName { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("-v|--version <VERSION>")]
 | 
			
		||||
            [Description("The version of the package to add.")]
 | 
			
		||||
            public string Version { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("-f|--framework <FRAMEWORK>")]
 | 
			
		||||
            [Description("Add the reference only when targeting a specific framework.")]
 | 
			
		||||
            public string Framework { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--no-restore")]
 | 
			
		||||
            [Description("Add the reference without performing restore preview and compatibility check.")]
 | 
			
		||||
            public bool NoRestore { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--source <SOURCE>")]
 | 
			
		||||
            [Description("The NuGet package source to use during the restore.")]
 | 
			
		||||
            public string Source { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--package-directory <PACKAGEDIR>")]
 | 
			
		||||
            [Description("The directory to restore packages to.")]
 | 
			
		||||
            public string PackageDirectory { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--interactive")]
 | 
			
		||||
            [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")]
 | 
			
		||||
            public bool Interactive { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int Execute(CommandContext context, Settings settings)
 | 
			
		||||
        {
 | 
			
		||||
            SettingsDumper.Dump(settings);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										30
									
								
								examples/Cli/Demo/Commands/Add/AddReferenceCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								examples/Cli/Demo/Commands/Add/AddReferenceCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using Demo.Utilities;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Demo.Commands
 | 
			
		||||
{
 | 
			
		||||
    public sealed class AddReferenceCommand : Command<AddReferenceCommand.Settings>
 | 
			
		||||
    {
 | 
			
		||||
        public sealed class Settings : AddSettings
 | 
			
		||||
        {
 | 
			
		||||
            [CommandArgument(0, "<PROJECTPATH>")]
 | 
			
		||||
            [Description("The package reference to add.")]
 | 
			
		||||
            public string ProjectPath { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("-f|--framework <FRAMEWORK>")]
 | 
			
		||||
            [Description("Add the reference only when targeting a specific framework.")]
 | 
			
		||||
            public string Framework { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--interactive")]
 | 
			
		||||
            [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")]
 | 
			
		||||
            public bool Interactive { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int Execute(CommandContext context, Settings settings)
 | 
			
		||||
        {
 | 
			
		||||
            SettingsDumper.Dump(settings);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								examples/Cli/Demo/Commands/Add/AddSettings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								examples/Cli/Demo/Commands/Add/AddSettings.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,12 @@
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Demo.Commands
 | 
			
		||||
{
 | 
			
		||||
    public abstract class AddSettings : CommandSettings
 | 
			
		||||
    {
 | 
			
		||||
        [CommandArgument(0, "<PROJECT>")]
 | 
			
		||||
        [Description("The project file to operate on. If a file is not specified, the command will search the current directory for one.")]
 | 
			
		||||
        public string Project { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										70
									
								
								examples/Cli/Demo/Commands/Run/RunCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								examples/Cli/Demo/Commands/Run/RunCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using Demo.Utilities;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Demo.Commands
 | 
			
		||||
{
 | 
			
		||||
    [Description("Build and run a .NET project output.")]
 | 
			
		||||
    public sealed class RunCommand : Command<RunCommand.Settings>
 | 
			
		||||
    {
 | 
			
		||||
        public sealed class Settings : CommandSettings
 | 
			
		||||
        {
 | 
			
		||||
            [CommandOption("-c|--configuration <CONFIGURATION>")]
 | 
			
		||||
            [Description("The configuration to run for. The default for most projects is '[grey]Debug[/]'.")]
 | 
			
		||||
            [DefaultValue("Debug")]
 | 
			
		||||
            public string Configuration { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("-f|--framework <FRAMEWORK>")]
 | 
			
		||||
            [Description("The target framework to run for. The target framework must also be specified in the project file.")]
 | 
			
		||||
            public string Framework { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("-r|--runtime <RUNTIMEIDENTIFIER>")]
 | 
			
		||||
            [Description("The target runtime to run for.")]
 | 
			
		||||
            public string RuntimeIdentifier { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("-p|--project <PROJECTPATH>")]
 | 
			
		||||
            [Description("The path to the project file to run (defaults to the current directory if there is only one project).")]
 | 
			
		||||
            public string ProjectPath { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--launch-profile <LAUNCHPROFILE>")]
 | 
			
		||||
            [Description("The name of the launch profile (if any) to use when launching the application.")]
 | 
			
		||||
            public string LaunchProfile { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--no-launch-profile")]
 | 
			
		||||
            [Description("Do not attempt to use [grey]launchSettings.json[/] to configure the application.")]
 | 
			
		||||
            public bool NoLaunchProfile { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--no-build")]
 | 
			
		||||
            [Description("Do not build the project before running. Implies [grey]--no-restore[/].")]
 | 
			
		||||
            public bool NoBuild { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--interactive")]
 | 
			
		||||
            [Description("Allows the command to stop and wait for user input or action (for example to complete authentication).")]
 | 
			
		||||
            public string Interactive { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--no-restore")]
 | 
			
		||||
            [Description("Do not restore the project before building.")]
 | 
			
		||||
            public bool NoRestore { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--verbosity <VERBOSITY>")]
 | 
			
		||||
            [Description("Set the MSBuild verbosity level. Allowed values are q[grey]uiet[/], m[grey]inimal[/], n[grey]ormal[/], d[grey]etailed[/], and diag[grey]nostic[/].")]
 | 
			
		||||
            [TypeConverter(typeof(VerbosityConverter))]
 | 
			
		||||
            [DefaultValue(Verbosity.Normal)]
 | 
			
		||||
            public Verbosity Verbosity { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--no-dependencies")]
 | 
			
		||||
            [Description("Do not restore project-to-project references and only restore the specified project.")]
 | 
			
		||||
            public bool NoDependencies { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("--force")]
 | 
			
		||||
            [Description("Force all dependencies to be resolved even if the last restore was successful. This is equivalent to deleting [grey]project.assets.json[/].")]
 | 
			
		||||
            public bool Force { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int Execute(CommandContext context, Settings settings)
 | 
			
		||||
        {
 | 
			
		||||
            SettingsDumper.Dump(settings);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										41
									
								
								examples/Cli/Demo/Commands/Serve/ServeCommand.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								examples/Cli/Demo/Commands/Serve/ServeCommand.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using Demo.Utilities;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Demo.Commands
 | 
			
		||||
{
 | 
			
		||||
    [Description("Launches a web server in the current working directory and serves all files in it.")]
 | 
			
		||||
    public sealed class ServeCommand : Command<ServeCommand.Settings>
 | 
			
		||||
    {
 | 
			
		||||
        public sealed class Settings : CommandSettings
 | 
			
		||||
        {
 | 
			
		||||
            [CommandOption("-p|--port <PORT>")]
 | 
			
		||||
            [Description("Port to use. Defaults to [grey]8080[/]. Use [grey]0[/] for a dynamic port.")]
 | 
			
		||||
            public int Port { get; set; }
 | 
			
		||||
 | 
			
		||||
            [CommandOption("-o|--open-browser [BROWSER]")]
 | 
			
		||||
            [Description("Open a web browser when the server starts. You can also specify which browser to use. If none is specified, the default one will be used.")]
 | 
			
		||||
            public FlagValue<string> OpenBrowser { get; set; }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override int Execute(CommandContext context, Settings settings)
 | 
			
		||||
        {
 | 
			
		||||
            if (settings.OpenBrowser.IsSet)
 | 
			
		||||
            {
 | 
			
		||||
                var browser = settings.OpenBrowser.Value;
 | 
			
		||||
                if (browser != null)
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine($"Open in {browser}");
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    Console.WriteLine($"Open in default browser.");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            SettingsDumper.Dump(settings);
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								examples/Cli/Demo/Demo.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								examples/Cli/Demo/Demo.csproj
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
<Project Sdk="Microsoft.NET.Sdk">
 | 
			
		||||
 | 
			
		||||
  <PropertyGroup>
 | 
			
		||||
    <OutputType>Exe</OutputType>
 | 
			
		||||
    <TargetFramework>net5.0</TargetFramework>
 | 
			
		||||
    <IsPackable>false</IsPackable>
 | 
			
		||||
    <ExampleName>Demo</ExampleName>
 | 
			
		||||
    <ExampleDescription>Demonstrates the most common use cases of Spectre.Cli.</ExampleDescription>
 | 
			
		||||
    <ExampleGroup>Cli</ExampleGroup>
 | 
			
		||||
    <ExampleVisible>false</ExampleVisible>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <ProjectReference Include="..\..\..\src\Spectre.Console\Spectre.Console.csproj" />
 | 
			
		||||
  </ItemGroup>
 | 
			
		||||
 | 
			
		||||
</Project>
 | 
			
		||||
							
								
								
									
										37
									
								
								examples/Cli/Demo/Program.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								examples/Cli/Demo/Program.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
using Demo.Commands;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Demo
 | 
			
		||||
{
 | 
			
		||||
    public static class Program
 | 
			
		||||
    {
 | 
			
		||||
        public static int Main(string[] args)
 | 
			
		||||
        {
 | 
			
		||||
            var app = new CommandApp();
 | 
			
		||||
            app.Configure(config =>
 | 
			
		||||
            {
 | 
			
		||||
                config.SetApplicationName("fake-dotnet");
 | 
			
		||||
                config.ValidateExamples();
 | 
			
		||||
                config.AddExample(new[] { "run", "--no-build" });
 | 
			
		||||
 | 
			
		||||
                // Run
 | 
			
		||||
                config.AddCommand<RunCommand>("run");
 | 
			
		||||
 | 
			
		||||
                // Add
 | 
			
		||||
                config.AddBranch<AddSettings>("add", add =>
 | 
			
		||||
                {
 | 
			
		||||
                    add.SetDescription("Add a package or reference to a .NET project");
 | 
			
		||||
                    add.AddCommand<AddPackageCommand>("package");
 | 
			
		||||
                    add.AddCommand<AddReferenceCommand>("reference");
 | 
			
		||||
                });
 | 
			
		||||
 | 
			
		||||
                // Serve
 | 
			
		||||
                config.AddCommand<ServeCommand>("serve")
 | 
			
		||||
                    .WithExample(new[] { "serve", "-o", "firefox" })
 | 
			
		||||
                    .WithExample(new[] { "serve", "--port", "80", "-o", "firefox" });
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            return app.Run(args);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										29
									
								
								examples/Cli/Demo/Utilities/SettingsDumper.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								examples/Cli/Demo/Utilities/SettingsDumper.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
using Spectre.Console;
 | 
			
		||||
using Spectre.Console.Cli;
 | 
			
		||||
 | 
			
		||||
namespace Demo.Utilities
 | 
			
		||||
{
 | 
			
		||||
    public static class SettingsDumper
 | 
			
		||||
    {
 | 
			
		||||
        public static void Dump(CommandSettings settings)
 | 
			
		||||
        {
 | 
			
		||||
            var table = new Table().RoundedBorder();
 | 
			
		||||
            table.AddColumn("[grey]Name[/]");
 | 
			
		||||
            table.AddColumn("[grey]Value[/]");
 | 
			
		||||
 | 
			
		||||
            var properties = settings.GetType().GetProperties();
 | 
			
		||||
            foreach (var property in properties)
 | 
			
		||||
            {
 | 
			
		||||
                var value = property.GetValue(settings)
 | 
			
		||||
                    ?.ToString()
 | 
			
		||||
                    ?.Replace("[", "[[");
 | 
			
		||||
 | 
			
		||||
                table.AddRow(
 | 
			
		||||
                    property.Name,
 | 
			
		||||
                    value ?? "[grey]null[/]");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            AnsiConsole.Render(table);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								examples/Cli/Demo/Verbosity.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								examples/Cli/Demo/Verbosity.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,54 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
 | 
			
		||||
namespace Demo
 | 
			
		||||
{
 | 
			
		||||
    public enum Verbosity
 | 
			
		||||
    {
 | 
			
		||||
        Quiet,
 | 
			
		||||
        Minimal,
 | 
			
		||||
        Normal,
 | 
			
		||||
        Detailed,
 | 
			
		||||
        Diagnostic
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public sealed class VerbosityConverter : TypeConverter
 | 
			
		||||
    {
 | 
			
		||||
        private readonly Dictionary<string, Verbosity> _lookup;
 | 
			
		||||
 | 
			
		||||
        public VerbosityConverter()
 | 
			
		||||
        {
 | 
			
		||||
            _lookup = new Dictionary<string, Verbosity>(StringComparer.OrdinalIgnoreCase)
 | 
			
		||||
            {
 | 
			
		||||
                { "q", Verbosity.Quiet },
 | 
			
		||||
                { "quiet", Verbosity.Quiet },
 | 
			
		||||
                { "m", Verbosity.Minimal },
 | 
			
		||||
                { "minimal", Verbosity.Minimal },
 | 
			
		||||
                { "n", Verbosity.Normal },
 | 
			
		||||
                { "normal", Verbosity.Normal },
 | 
			
		||||
                { "d", Verbosity.Detailed },
 | 
			
		||||
                { "detailed", Verbosity.Detailed },
 | 
			
		||||
                { "diag", Verbosity.Diagnostic },
 | 
			
		||||
                { "diagnostic", Verbosity.Diagnostic }
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
 | 
			
		||||
        {
 | 
			
		||||
            if (value is string stringValue)
 | 
			
		||||
            {
 | 
			
		||||
                var result = _lookup.TryGetValue(stringValue, out var verbosity);
 | 
			
		||||
                if (!result)
 | 
			
		||||
                {
 | 
			
		||||
                    const string format = "The value '{0}' is not a valid verbosity.";
 | 
			
		||||
                    var message = string.Format(CultureInfo.InvariantCulture, format, value);
 | 
			
		||||
                    throw new InvalidOperationException(message);
 | 
			
		||||
                }
 | 
			
		||||
                return verbosity;
 | 
			
		||||
            }
 | 
			
		||||
            throw new NotSupportedException("Can't convert value to verbosity.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user