/// <summary>
        /// Configures common services for Upgrade Assistant CLI execution, including an IAppCommand that will run when the host starts.
        /// </summary>
        /// <typeparam name="TApp">The type of command to start running.</typeparam>
        /// <param name="host">The host builder to register services in.</param>
        /// <param name="options">Options provided by the user on the command line.</param>
        /// <param name="parseResult">The result of parsing command line arguments.</param>
        /// <returns>The host builder updated to include services necessary to run Upgrade Assistant as a command line app.</returns>
        public static IHostBuilder UseConsoleUpgradeAssistant <TApp>(
            this IHostBuilder host,
            IUpgradeAssistantOptions options,
            ParseResult parseResult)
            where TApp : class, IAppCommand
        {
            if (options is null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            Program.ShowHeader();

            const string LogFilePath = "upgrade-assistant.clef";

            var logSettings = new LogSettings(options.IsVerbose);

            return(host
                   .UseUpgradeAssistant <TApp>(options)
                   .ConfigureServices(services =>
            {
                services.AddSingleton(logSettings);

                services.AddSingleton(parseResult);
                services.AddTransient <IUpgradeStartup, UsedCommandTelemetry>();
            })
                   .UseSerilog((context, __, loggerConfiguration) => loggerConfiguration
                               .Enrich.FromLogContext()
                               .MinimumLevelFromConfiguration(context.Configuration.GetSection("Logging:Loglevel"))
                               .MinimumLevel.Override("System", LogEventLevel.Warning)
                               .MinimumLevel.Is(LogEventLevel.Verbose)
                               .WriteTo.Console(levelSwitch: logSettings.Console)
                               .WriteTo.File(new CompactJsonFormatter(), LogFilePath, levelSwitch: logSettings.File)));
        }
Example #2
0
 private static void AddStateFactory(this IServiceCollection services, IUpgradeAssistantOptions upgradeOptions)
 {
     services.AddSingleton <IUpgradeStateManager, FileUpgradeStateFactory>();
     services
     .AddOptions <FileStateOptions>()
     .Configure(options =>
     {
         if (upgradeOptions.Project?.DirectoryName is string directory)
         {
             options.Path = Path.Combine(directory, ".upgrade-assistant");
         }
     })
     .ValidateDataAnnotations();
 }
        public static IHostBuilder UseUpgradeAssistant <TApp>(this IHostBuilder host, IUpgradeAssistantOptions upgradeOptions)
            where TApp : class, IAppCommand
        {
            if (host is null)
            {
                throw new ArgumentNullException(nameof(host));
            }

            return(host
                   .UseContentRoot(AppContext.BaseDirectory)
                   .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                   .ConfigureServices((context, services) =>
            {
                services.AddHttpClient();

                // Register this first so the first startup step is to check for telemetry opt-out
                services.AddTransient <IUpgradeStartup, ConsoleFirstTimeUserNotifier>();
                services.AddTelemetry(options =>
                {
                    context.Configuration.GetSection("Telemetry").Bind(options);
                    options.ProductVersion = UpgradeVersion.Current.FullVersion;
                });

                services.AddHostedService <ConsoleRunner>();
                services.AddStepManagement();
                services.AddExtensions()
                .AddDefaultExtensions(context.Configuration)
                .AddFromEnvironmentVariables(context.Configuration);

                services.TryAddTransient <IUserInput, ConsoleCollectUserInput>();

                services.AddAnalysis(options =>
                {
                    options.Format = upgradeOptions.Format ?? context.Configuration["Analysis:DefaultFormat"];
                });

                services.AddSingleton(new InputOutputStreams(Console.In, Console.Out));
                services.AddSingleton <CommandProvider>();
                services.TryAddSingleton(new LogSettings(true));

                services.AddSingleton <IProcessRunner, ProcessRunner>();
                services.AddSingleton <ErrorCodeAccessor>();

                services.AddTargetFrameworkSelectors(options =>
                {
                    context.Configuration.GetSection("DefaultTargetFrameworks").Bind(options);
                    options.TargetTfmSupport = upgradeOptions.TargetTfmSupport;
                });

                services.AddScoped <IAppCommand, TApp>();
            })
                   .UseConsoleLifetime(options =>
            {
                options.SuppressStatusMessages = true;
            }));
        }
Example #4
0
        public static IHostBuilder UseUpgradeAssistant <TApp>(this IHostBuilder host, IUpgradeAssistantOptions upgradeOptions)
            where TApp : class, IAppCommand
        {
            if (host is null)
            {
                throw new ArgumentNullException(nameof(host));
            }

            return(host
                   .UseContentRoot(AppContext.BaseDirectory)
                   .UseServiceProviderFactory(new AutofacServiceProviderFactory())
                   .ConfigureServices((context, services) =>
            {
                services.AddHttpClient();

                // Register this first so the first startup step is to check for telemetry opt-out
                services.AddTransient <IUpgradeStartup, ConsoleFirstTimeUserNotifier>();
                services.AddTelemetry(options =>
                {
                    context.Configuration.GetSection("Telemetry").Bind(options);
                    options.ProductVersion = UpgradeVersion.Current.FullVersion;
                });

                services.AddHostedService <ConsoleRunner>();
                services.AddStepManagement();
                services.AddStateFactory(upgradeOptions);
                services.AddExtensions()
                .AddDefaultExtensions(context.Configuration)
                .AddFromEnvironmentVariables(context.Configuration)
                .Configure(options =>
                {
                    options.AdditionalOptions = upgradeOptions.AdditionalOptions;
                    options.CheckMinimumVersion = !UpgradeVersion.Current.IsDevelopment;
                    options.CurrentVersion = UpgradeVersion.Current.Version;

                    foreach (var path in upgradeOptions.Extension)
                    {
                        options.ExtensionPaths.Add(path);
                    }
                });

                services.AddMsBuild(optionss =>
                {
                    if (upgradeOptions.Project?.FullName is string fullname)
                    {
                        optionss.InputPath = fullname;
                    }

                    if (upgradeOptions.VSPath?.FullName is string vspath)
                    {
                        optionss.VisualStudioPath = vspath;
                    }

                    if (upgradeOptions.MSBuildPath?.FullName is string msbuildPath)
                    {
                        optionss.MSBuildPath = msbuildPath;
                    }
                });

                services.AddUserInput();
                services.AddAnalysis(options =>
                {
                    options.Format = upgradeOptions.Format;
                });

                services.AddSingleton(new InputOutputStreams(Console.In, Console.Out));
                services.AddSingleton <CommandProvider>();
                services.TryAddSingleton(new LogSettings(true));

                services.AddSingleton <IProcessRunner, ProcessRunner>();
                services.AddSingleton <ErrorCodeAccessor>();

                services.AddTargetFrameworkSelectors(options =>
                {
                    context.Configuration.GetSection("DefaultTargetFrameworks").Bind(options);
                    options.TargetTfmSupport = upgradeOptions.TargetTfmSupport;
                });

                services.AddReadinessChecks(options =>
                {
                    options.IgnoreUnsupportedFeatures = upgradeOptions.IgnoreUnsupportedFeatures;
                });

                services.AddScoped <IAppCommand, TApp>();
            })
                   .UseConsoleLifetime(options =>
            {
                options.SuppressStatusMessages = true;
            }));
        }