2015-11-16 11:21:57 -08:00
// Copyright (c) .NET Foundation and contributors. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
using System ;
2015-11-01 16:21:10 -08:00
using System.Collections.Generic ;
2015-10-06 02:19:27 -07:00
using System.Linq ;
2015-12-18 16:39:43 -08:00
using System.Reflection ;
2015-10-06 10:46:43 -07:00
using Microsoft.DotNet.Cli.Utils ;
2015-12-18 16:39:43 -08:00
using Microsoft.Extensions.PlatformAbstractions ;
2015-11-28 00:28:45 -08:00
using NuGet.Frameworks ;
2015-10-03 11:34:08 -07:00
namespace Microsoft.DotNet.Cli
{
public class Program
{
2015-12-18 16:39:43 -08:00
private const string ProductLongName = ".NET Command Line Tools" ;
private const string UsageText = @ "Usage: dotnet [common-options] [command] [arguments]
2015-11-01 16:21:10 -08:00
Arguments :
[command] The command to execute
[arguments] Arguments to pass to the command
Common Options ( passed before the command ) :
- v | - - verbose Enable verbose output
2015-12-18 16:39:43 -08:00
- - version Display . NET CLI Version Info
2015-11-01 16:21:10 -08:00
Common Commands :
2015-12-03 02:16:52 -08:00
new Initialize a basic . NET project
2015-12-02 10:26:10 -08:00
restore Restore dependencies specified in the . NET project
2015-11-01 16:21:10 -08:00
compile Compiles a . NET project
2015-12-02 10:26:10 -08:00
publish Publishes a . NET project for deployment ( including the runtime )
run Compiles and immediately executes a . NET project
2015-12-07 14:18:09 -08:00
repl Launch an interactive session ( read , eval , print , loop )
2015-12-02 11:19:41 -08:00
pack Creates a NuGet package ";
2015-12-18 16:39:43 -08:00
private static readonly string ProductVersion = GetProductVersion ( ) ;
private static string GetProductVersion ( )
{
var attr = typeof ( Program ) . GetTypeInfo ( ) . Assembly . GetCustomAttribute < AssemblyInformationalVersionAttribute > ( ) ;
return attr ? . InformationalVersion ;
}
2015-11-01 16:21:10 -08:00
2015-10-03 11:34:08 -07:00
public static int Main ( string [ ] args )
{
2015-11-28 00:28:45 -08:00
DebugHelper . HandleDebugSwitch ( ref args ) ;
2016-01-06 02:27:16 -08:00
try
{
return ProcessArgs ( args ) ;
}
catch ( CommandUnknownException e )
{
Console . WriteLine ( e . Message ) ;
return 1 ;
}
}
private static int ProcessArgs ( string [ ] args )
{
2015-11-01 16:21:10 -08:00
// CommandLineApplication is a bit restrictive, so we parse things ourselves here. Individual apps should use CLA.
2016-01-06 02:27:16 -08:00
2015-11-01 16:21:10 -08:00
var verbose = false ;
2016-01-06 02:27:16 -08:00
var success = true ;
2015-11-01 16:21:10 -08:00
var command = string . Empty ;
var lastArg = 0 ;
for ( ; lastArg < args . Length ; lastArg + + )
2015-10-08 14:49:39 -07:00
{
2015-11-01 16:21:10 -08:00
if ( IsArg ( args [ lastArg ] , "v" , "verbose" ) )
2015-10-08 14:49:39 -07:00
{
2015-11-01 16:21:10 -08:00
verbose = true ;
}
2015-12-18 16:39:43 -08:00
else if ( IsArg ( args [ lastArg ] , "version" ) )
{
PrintVersionInfo ( ) ;
return 0 ;
}
2015-11-16 17:39:03 -08:00
else if ( IsArg ( args [ lastArg ] , "h" , "help" ) )
{
PrintHelp ( ) ;
return 0 ;
}
2015-11-01 16:21:10 -08:00
else if ( args [ lastArg ] . StartsWith ( "-" ) )
{
2015-11-16 17:39:03 -08:00
Reporter . Error . WriteLine ( $"Unknown option: {args[lastArg]}" ) ;
success = false ;
2015-10-08 14:49:39 -07:00
}
else
{
2015-11-01 16:21:10 -08:00
// It's the command, and we're done!
command = args [ lastArg ] ;
break ;
2015-10-08 14:49:39 -07:00
}
}
2016-01-06 02:27:16 -08:00
if ( ! success )
{
2015-11-16 17:39:03 -08:00
PrintHelp ( ) ;
return 1 ;
}
2015-11-01 16:21:10 -08:00
var appArgs = ( lastArg + 1 ) > = args . Length ? Enumerable . Empty < string > ( ) : args . Skip ( lastArg + 1 ) . ToArray ( ) ;
if ( string . IsNullOrEmpty ( command ) | | command . Equals ( "help" , StringComparison . OrdinalIgnoreCase ) )
2015-10-08 14:49:39 -07:00
{
2015-11-01 16:21:10 -08:00
return RunHelpCommand ( appArgs ) ;
}
2016-01-06 02:27:16 -08:00
return Command . Create ( "dotnet-" + command , appArgs , FrameworkConstants . CommonFrameworks . DnxCore50 )
2015-11-01 16:21:10 -08:00
. EnvironmentVariable ( CommandContext . Variables . Verbose , verbose . ToString ( ) )
. EnvironmentVariable ( CommandContext . Variables . AnsiPassThru , bool . TrueString )
. ForwardStdErr ( )
. ForwardStdOut ( )
. Execute ( )
. ExitCode ;
}
private static int RunHelpCommand ( IEnumerable < string > appArgs )
{
if ( appArgs . Any ( ) )
{
return Command . Create ( "dotnet-" + appArgs . First ( ) , "--help" )
2015-10-08 14:49:39 -07:00
. ForwardStdErr ( )
. ForwardStdOut ( )
2015-10-21 03:11:27 -07:00
. Execute ( )
2015-10-08 14:49:39 -07:00
. ExitCode ;
}
2015-11-01 16:21:10 -08:00
else
{
PrintHelp ( ) ;
return 0 ;
}
}
2015-11-16 20:26:52 -08:00
private static void PrintHelp ( )
2015-11-01 16:21:10 -08:00
{
2015-12-18 16:39:43 -08:00
PrintVersionHeader ( ) ;
Reporter . Output . WriteLine ( UsageText ) ;
}
private static void PrintVersionHeader ( )
{
var versionString = string . IsNullOrEmpty ( ProductVersion ) ?
string . Empty :
$" ({ProductVersion})" ;
Reporter . Output . WriteLine ( ProductLongName + versionString ) ;
}
private static void PrintVersionInfo ( )
{
PrintVersionHeader ( ) ;
var runtimeEnvironment = PlatformServices . Default . Runtime ;
Reporter . Output . WriteLine ( "Runtime Environment:" ) ;
Reporter . Output . WriteLine ( $" OS Name: {runtimeEnvironment.OperatingSystem}" ) ;
Reporter . Output . WriteLine ( $" OS Version: {runtimeEnvironment.OperatingSystemVersion}" ) ;
Reporter . Output . WriteLine ( $" OS Platform: {runtimeEnvironment.OperatingSystemPlatform}" ) ;
Reporter . Output . WriteLine ( $" Runtime Id: {runtimeEnvironment.GetRuntimeIdentifier()}" ) ;
}
private static bool IsArg ( string candidate , string longName )
{
return IsArg ( candidate , shortName : null , longName : longName ) ;
2015-10-08 14:49:39 -07:00
}
2015-11-01 16:21:10 -08:00
private static bool IsArg ( string candidate , string shortName , string longName )
2015-10-08 14:49:39 -07:00
{
2015-12-18 16:39:43 -08:00
return ( shortName ! = null & & candidate . Equals ( "-" + shortName ) ) | | ( longName ! = null & & candidate . Equals ( "--" + longName ) ) ;
2015-10-06 02:19:27 -07:00
}
2015-10-03 11:34:08 -07:00
}
}