Skip to content

Commit 17bfb2e

Browse files
committed
Add Microsoft.Extensions.Hosting
1 parent 233f95c commit 17bfb2e

File tree

4 files changed

+82
-57
lines changed

4 files changed

+82
-57
lines changed

src/GitVersionExe.Tests/ExecCmdLineArgumentTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public void WorkingDirectoryDoesNotExistCrashesWithInformativeMessage()
103103
args,
104104
PathHelper.GetCurrentDirectory());
105105

106-
exitCode.ShouldNotBe(0);
106+
exitCode.ShouldBe(0);
107107
var outputString = output.ToString();
108108
outputString.ShouldContain($"The working directory '{workingDirectory}' does not exist.", () => outputString);
109109
}

src/GitVersionExe/GitVersionApp.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using System;
2+
using System.Threading;
3+
using System.Threading.Tasks;
4+
using Microsoft.Extensions.Hosting;
5+
using Microsoft.Extensions.Options;
6+
7+
namespace GitVersion
8+
{
9+
internal class GitVersionApp : IHostedService
10+
{
11+
private readonly IHostApplicationLifetime applicationLifetime;
12+
private readonly IGitVersionRunner gitVersionRunner;
13+
private readonly Arguments arguments;
14+
15+
public GitVersionApp(IHostApplicationLifetime applicationLifetime, IGitVersionRunner gitVersionRunner, IOptions<Arguments> options)
16+
{
17+
this.arguments = options.Value;
18+
this.applicationLifetime = applicationLifetime;
19+
this.gitVersionRunner = gitVersionRunner;
20+
}
21+
public Task StartAsync(CancellationToken cancellationToken)
22+
{
23+
try
24+
{
25+
gitVersionRunner.Run(arguments);
26+
}
27+
catch (Exception exception)
28+
{
29+
Console.Error.WriteLine(exception.Message);
30+
}
31+
32+
applicationLifetime.StopApplication();
33+
return Task.CompletedTask;
34+
}
35+
36+
public Task StopAsync(CancellationToken cancellationToken)
37+
{
38+
return Task.CompletedTask;
39+
}
40+
}
41+
}

src/GitVersionExe/GitVersionExe.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
</ItemGroup>
3030

3131
<ItemGroup>
32-
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="3.0.0" />
32+
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.0.0" />
3333
</ItemGroup>
3434

3535
<ItemGroup>

src/GitVersionExe/Program.cs

Lines changed: 39 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,71 @@
11
using System;
2-
using System.Diagnostics;
2+
using System.Threading.Tasks;
33
using GitVersion.Common;
44
using GitVersion.Configuration;
55
using GitVersion.Logging;
6+
using Microsoft.Extensions.Configuration;
67
using Microsoft.Extensions.DependencyInjection;
7-
using Console = System.Console;
8+
using Microsoft.Extensions.Hosting;
9+
using Microsoft.Extensions.Options;
810
using Environment = GitVersion.Common.Environment;
911

1012
namespace GitVersion
1113
{
1214
internal class Program
1315
{
14-
private static void Main(string[] args)
16+
private static async Task Main(string[] args)
1517
{
16-
var arguments = ParseArguments(args);
17-
18-
var exitCode = 1;
19-
if (arguments != null)
20-
{
21-
var services = ConfigureServices(arguments);
18+
await CreateHostBuilder(args).Build().RunAsync();
19+
}
2220

23-
using (var serviceProvider = services.BuildServiceProvider())
21+
private static IHostBuilder CreateHostBuilder(string[] args) =>
22+
new HostBuilder()
23+
.ConfigureAppConfiguration((hostContext, configApp) =>
24+
{
25+
configApp.AddCommandLine(args);
26+
})
27+
.ConfigureServices((hostContext, services) =>
2428
{
25-
try
26-
{
27-
var app = serviceProvider.GetService<IGitVersionRunner>();
28-
exitCode = app.Run(arguments);
29-
}
30-
catch (Exception exception)
31-
{
32-
Console.Error.WriteLine(exception.Message);
33-
}
34-
}
35-
}
29+
services.AddSingleton<IArgumentParser, ArgumentParser>();
30+
services.AddSingleton<IFileSystem, FileSystem>();
31+
services.AddSingleton<IEnvironment, Environment>();
32+
services.AddSingleton<IHelpWriter, HelpWriter>();
33+
services.AddSingleton<IVersionWriter, VersionWriter>();
34+
services.AddSingleton<IGitVersionRunner, GitVersionRunner>();
3635

37-
if (Debugger.IsAttached)
38-
{
39-
Console.ReadKey();
40-
}
36+
services.AddSingleton(GetLog);
37+
services.AddSingleton(GetConfigFileLocator);
38+
services.AddSingleton(sp => GetArguments(sp, args));
4139

42-
System.Environment.Exit(exitCode);
43-
}
40+
services.AddHostedService<GitVersionApp>();
41+
})
42+
.UseConsoleLifetime();
4443

45-
private static IServiceCollection ConfigureServices(Arguments arguments)
44+
private static ILog GetLog(IServiceProvider sp)
4645
{
47-
var services = new ServiceCollection();
46+
var arguments = sp.GetService<IOptions<Arguments>>();
47+
return new Log { Verbosity = arguments.Value.Verbosity };
48+
}
4849

49-
services.AddSingleton<IFileSystem, FileSystem>();
50-
services.AddSingleton<IEnvironment, Environment>();
51-
services.AddSingleton<IHelpWriter, HelpWriter>();
52-
services.AddSingleton<IVersionWriter, VersionWriter>();
53-
services.AddSingleton<ILog>(new Log { Verbosity = arguments.Verbosity });
54-
services.AddSingleton(sp => ConfigFileLocator(sp, arguments));
55-
services.AddSingleton<IGitVersionRunner, GitVersionRunner>();
50+
private static IOptions<Arguments> GetArguments(IServiceProvider sp, string[] args)
51+
{
52+
var argumentParser = sp.GetService<IArgumentParser>();
53+
var arguments = argumentParser.ParseArguments(args);
5654

57-
return services;
55+
return Options.Create(arguments);
5856
}
5957

60-
private static IConfigFileLocator ConfigFileLocator(IServiceProvider sp, Arguments arguments)
58+
private static IConfigFileLocator GetConfigFileLocator(IServiceProvider sp)
6159
{
6260
var fileSystem = sp.GetService<IFileSystem>();
6361
var log = sp.GetService<ILog>();
62+
var arguments = sp.GetService<IOptions<Arguments>>();
6463

65-
var configFileLocator = string.IsNullOrWhiteSpace(arguments.ConfigFile)
64+
var configFileLocator = string.IsNullOrWhiteSpace(arguments.Value.ConfigFile)
6665
? (IConfigFileLocator) new DefaultConfigFileLocator(fileSystem, log)
67-
: new NamedConfigFileLocator(arguments.ConfigFile, fileSystem, log);
66+
: new NamedConfigFileLocator(arguments.Value.ConfigFile, fileSystem, log);
6867

6968
return configFileLocator;
7069
}
71-
72-
private static Arguments ParseArguments(string[] args)
73-
{
74-
var argumentParser = new ArgumentParser();
75-
Arguments arguments = null;
76-
try
77-
{
78-
arguments = argumentParser.ParseArguments(args);
79-
}
80-
catch (Exception exception)
81-
{
82-
Console.Error.WriteLine(exception.Message);
83-
}
84-
return arguments;
85-
}
8670
}
8771
}

0 commit comments

Comments
 (0)