Skip to content

Commit

Permalink
Merge pull request #124 from guitarrapc/feature/refactor
Browse files Browse the repository at this point in the history
chore: refactor command handling.
  • Loading branch information
guitarrapc authored Feb 5, 2025
2 parents 9b1ca5d + e1092bf commit fb4e7c5
Show file tree
Hide file tree
Showing 12 changed files with 55 additions and 85 deletions.
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@
<PackageVersion Include="xunit" Version="2.9.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.0.1" />
</ItemGroup>
</Project>
</Project>
30 changes: 13 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,17 +37,13 @@ Install-Package UnityBuildRunner.Core

You can run installed tool via `UnityBuildRunner` (.NET Global Tool) or `dotnet UnityBuildRunner` (.NET Tool) command.

```
```sh
$ UnityBuildRunner --help
Usage: UnityBuildRunner [options...]
Usage: run [options...]

Options:
-unity-path, --unity-path <String> Full Path to the Unity.exe (Leave empty when use 'UnityPath' Environment variables instead.) (Default: )
-timeout, --timeout <String> Timeout to terminate execution within. default: "00:60:00" (Default: 02:00:00)
Commands:
help Display help.
version Display version.
-unity-path, --unity-path <String> Full Path to the Unity executable, leave empty when use 'UnityPath' Environment variables instead. (Default: )
-timeout, --timeout <String> Timeout for Unity Build. (Default: 02:00:00)
```

## CLI (Basic)
Expand All @@ -58,31 +54,31 @@ All you need to do is pass unity's path as `-u UnityPath` and leave other argmen
If you are running Unity batch build like this.

```sh
$ "C:\Program Files\Unity\Hub\Editor\2022.3.3f1\Editor\Unity.exe" -quit -batchmode -buildTarget "WindowsStoreApps" -projectPath "C:\git\MRTKSample\Unity" -logfile "log.log" -executeMethod "HoloToolkit.Unity.HoloToolkitCommands.BuildSLN"
```
```sh
$ "C:/Program Files/Unity/Hub/Editor/6000.0.12f1/Editor/Unity.exe" -quit -batchmode -nographics -silent-crashes -logfile "log.log" -buildTarget "StandaloneWindows64" -projectPath "C:/github/UnityBuildRunner/sandbox/Sandbox.Unity" -executeMethod "BuildUnity.BuildGame"
```

Then, append `UnityBuildRunner --unity-path <UnityPath>` or `dotnet UnityBuildRunner --unity-path <UnityPath>` to existing command, that's all.

```sh
# .NET Global Tool
$ UnityBuildRunner --unity-path "C:\Program Files\Unity\Hub\Editor\2022.3.3f1\Editor\Unity.exe" -quit -batchmode -buildTarget "WindowsStoreApps" -projectPath "C:\git\MRTKSample\Unity" -logfile "log.log" -executeMethod "HoloToolkit.Unity.HoloToolkitCommands.BuildSLN"
$ UnityBuildRunner --unity-path "C:/Program Files/Unity/Hub/Editor/6000.0.12f1/Editor/Unity.exe" -quit -batchmode -nographics -silent-crashes -logfile "log.log" -buildTarget "StandaloneWindows64" -projectPath "C:/github/UnityBuildRunner/sandbox/Sandbox.Unity" -executeMethod "BuildUnity.BuildGame"

# .NET Tool
$ dotnet UnityBuildRunner --unity-path "C:\Program Files\Unity\Hub\Editor\2022.3.3f1\Editor\Unity.exe" -quit -batchmode -buildTarget "WindowsStoreApps" -projectPath "C:\git\MRTKSample\Unity" -logfile "log.log" -executeMethod "HoloToolkit.Unity.HoloToolkitCommands.BuildSLN"
$ dotnet UnityBuildRunner --unity-path "C:/Program Files/Unity/Hub/Editor/6000.0.12f1/Editor/Unity.exe" -quit -batchmode -nographics -silent-crashes -logfile "log.log" -buildTarget "StandaloneWindows64" -projectPath "C:/github/UnityBuildRunner/sandbox/Sandbox.Unity" -executeMethod "BuildUnity.BuildGame"
```

> **Note**: Another way to specifying UnityPath is via Environment Variable `UnityPath`.
```sh
# Environment Variables
$ set UnityPath=C:\Program Files\Unity\Hub\Editor\2022.3.3f1\Editor\Unity.exe
$ set UnityPath=C:/Program Files/Unity/Hub/Editor/6000.0.12f1/Editor/Unity.exe

# .NET Global Tool
$ UnityBuildRunner -quit -batchmode -buildTarget "WindowsStoreApps" -projectPath "C:\git\MRTKSample\Unity" -logfile "log.log" -executeMethod "HoloToolkit.Unity.HoloToolkitCommands.BuildSLN"
$ UnityBuildRunner -quit -batchmode -nographics -silent-crashes -logfile "log.log" -buildTarget "StandaloneWindows64" -projectPath "C:/github/UnityBuildRunner/sandbox/Sandbox.Unity" -executeMethod "BuildUnity.BuildGame"

# .NET Tool
$ dotnet UnityBuildRunner -quit -batchmode -buildTarget "WindowsStoreApps" -projectPath "C:\git\MRTKSample\Unity" -logfile "log.log" -executeMethod "HoloToolkit.Unity.HoloToolkitCommands.BuildSLN"
$ dotnet UnityBuildRunner -quit -batchmode -nographics -silent-crashes -logfile "log.log" -buildTarget "StandaloneWindows64" -projectPath "C:/github/UnityBuildRunner/sandbox/Sandbox.Unity" -executeMethod "BuildUnity.BuildGame"
```

## Library (Basic)
Expand All @@ -91,7 +87,7 @@ You can use as Library as well. This is sample code to run Unity Build.

```csharp
// Parse settings from argument
var settings = DefaultSettings.Parse(args, @"C:\Program Files\Unity\Hub\Editor\2022.3.3f1\Editor\Unity.exe", TimeSpan.FromMinutes(30));
var settings = DefaultSettings.Parse(args, @"C:/Program Files/Unity/Hub/Editor/6000.0.12f1/Editor/Unity.exe", TimeSpan.FromMinutes(30));
using var cts = settings.CreateCancellationTokenSource();

// Run build
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!655991488 &1
MultiplayerManager:
m_ObjectHideFlags: 0
m_EnableMultiplayerRoles: 0
m_StrippingTypes: {}
Empty file.
1 change: 0 additions & 1 deletion src/UnityBuildRunner.Core/BuildErrorCode.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using System;
using System.Reflection;

namespace UnityBuildRunner.Core;
Expand Down
2 changes: 0 additions & 2 deletions src/UnityBuildRunner.Core/BuildErrorFoundException.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
using System;

namespace UnityBuildRunner.Core;
internal class BuildErrorFoundException : Exception
{
Expand Down
40 changes: 13 additions & 27 deletions src/UnityBuildRunner.Core/DefaultBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
using Microsoft.Extensions.Logging;
using System;
using System.Diagnostics;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

namespace UnityBuildRunner.Core;

Expand All @@ -27,11 +23,8 @@ public interface IBuilder
/// <summary>
/// Default Unity builder
/// </summary>
public class DefaultBuilder : IBuilder
public class DefaultBuilder(ISettings settings, ILogger logger, IErrorFilter errorFilter) : IBuilder
{
private readonly ISettings settings;
private readonly ILogger logger;
private readonly IErrorFilter errorFilter;
private BuildErrorCode buildErrorCode = BuildErrorCode.Success;

public int ExitCode { get; private set; }
Expand All @@ -40,26 +33,21 @@ public class DefaultBuilder : IBuilder
{
}

public DefaultBuilder(ISettings settings, ILogger logger, IErrorFilter errorFilter)
{
this.settings = settings;
this.logger = logger;
this.errorFilter = errorFilter;
}

public async Task BuildAsync(CancellationToken ct = default)
{
// Initialize
logger.LogInformation($"Initializing UnityBuildRunner.");
await InitializeAsync(settings.LogFilePath, ct).ConfigureAwait(false);

// Build
logger.LogInformation("Starting Unity Build.");
logger.LogInformation($" - Command: {settings.UnityPath} {settings.ArgumentString}");
logger.LogInformation($" - WorkingDir: {settings.WorkingDirectory}");
logger.LogInformation($" - LogFilePath: {settings.LogFilePath}");
logger.LogInformation($" - Timeout: {settings.TimeOut}");
var sw = Stopwatch.StartNew();
logger.LogInformation($$"""
Starting Unity Build.
- Command: {{settings.UnityPath}} {{settings.ArgumentString}}
- WorkingDir: {{settings.WorkingDirectory}}
- LogFilePath: {{settings.LogFilePath}}
- Timeout: {{settings.TimeOut}}
""");
var ts = settings.TimeProvider.GetTimestamp();
using var process = Process.Start(new ProcessStartInfo()
{
FileName = settings.UnityPath,
Expand All @@ -86,14 +74,14 @@ public async Task BuildAsync(CancellationToken ct = default)
if (File.Exists(settings.LogFilePath)) break;

// Log waiting message.
if (sw.Elapsed.TotalSeconds > 10 && !waitingLongTime)
if (settings.TimeProvider.GetElapsedTime(ts).TotalSeconds > 10 && !waitingLongTime)
{
waitingLongTime = true;
logger.LogWarning("Waiting Unity creates log file takes long time, still waiting.");
}

// Some large repository's first Unity launch takes huge wait time until log file generated. However waiting more than 5min would be too slow and unnatural.
if (sw.Elapsed.TotalMinutes <= 5)
if (settings.TimeProvider.GetElapsedTime(ts).TotalMinutes <= 5)
{
await Task.Delay(TimeSpan.FromMilliseconds(100), ct).ConfigureAwait(false);
}
Expand Down Expand Up @@ -146,7 +134,7 @@ public async Task BuildAsync(CancellationToken ct = default)
logger.LogInformation($"Stopping build. {ex.Message}");
buildErrorCode = BuildErrorCode.ProcessImmediatelyExit;
}
catch (OperationCanceledException) when (sw.Elapsed.TotalMilliseconds > settings.TimeOut.TotalMilliseconds)
catch (OperationCanceledException) when (settings.TimeProvider.GetElapsedTime(ts).TotalMilliseconds > settings.TimeOut.TotalMilliseconds)
{
// Timeout
logger.LogInformation($"Stopping build. Timeout exceeded, {settings.TimeOut.TotalMinutes}min has been passed.");
Expand Down Expand Up @@ -175,8 +163,6 @@ public async Task BuildAsync(CancellationToken ct = default)
}
finally
{
sw.Stop();

if (buildErrorCode is BuildErrorCode.Success)
{
logger.LogInformation($"Unity Build successfully complete.");
Expand All @@ -185,7 +171,7 @@ public async Task BuildAsync(CancellationToken ct = default)
{
logger.LogInformation($"Unity Build failed, error code '{buildErrorCode}'.");
}
logger.LogInformation($"Build Elapsed Time {sw.Elapsed}");
logger.LogInformation($"Build Elapsed Time {settings.TimeProvider.GetElapsedTime(ts)}");

// Unity's exit code 0 is not mean no error. Therefore, when Unity exitcode was 0 and UnityBuildRunner caught any exception, replace exitcode with custom error.
ExitCode = unityProcessExitCode == 0 ? buildErrorCode.GetAttrubute<ErrorExitCodeAttribute>()?.ExitCode ?? unityProcessExitCode : unityProcessExitCode;
Expand Down
3 changes: 0 additions & 3 deletions src/UnityBuildRunner.Core/DefaultErrorFilter.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace UnityBuildRunner.Core;
Expand Down
13 changes: 6 additions & 7 deletions src/UnityBuildRunner.Core/DefaultSettings.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using System.Linq;
using System.Threading;

namespace UnityBuildRunner.Core;

Expand Down Expand Up @@ -41,6 +36,10 @@ public interface ISettings
/// UnityBuild timeout
/// </summary>
TimeSpan TimeOut { get; init; }
/// <summary>
/// Default Timeprovider to use
/// </summary>
TimeProvider TimeProvider { get; init; }

/// <summary>
/// Create CancelltaionTokenSource from <see cref="ISettings"/>.
Expand All @@ -59,7 +58,7 @@ public interface ISettings
/// <param name="LogFilePath"></param>
/// <param name="WorkingDirectory"></param>
/// <param name="TimeOut"></param>
public record DefaultSettings(string[] Args, string ArgumentString, string UnityPath, string LogFilePath, string WorkingDirectory, TimeSpan TimeOut) : ISettings
public record DefaultSettings(string[] Args, string ArgumentString, string UnityPath, string LogFilePath, string WorkingDirectory, TimeSpan TimeOut, TimeProvider TimeProvider) : ISettings
{
/// <summary>
/// Validate Settings is correct.
Expand Down Expand Up @@ -134,7 +133,7 @@ public static DefaultSettings Parse(IReadOnlyList<string> args, string unityPath
var workingDirectory = Directory.GetCurrentDirectory();

// Create settings
var settings = new DefaultSettings(arguments, argumentString, unityPathFixed, logFilePath, workingDirectory, timeout);
var settings = new DefaultSettings(arguments, argumentString, unityPathFixed, logFilePath, workingDirectory, timeout, TimeProvider.System);

// Validate settings
settings.Validate();
Expand Down
24 changes: 6 additions & 18 deletions src/UnityBuildRunner.Core/SimpleConsoleLogger.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,39 +4,28 @@

namespace UnityBuildRunner.Core;

public class SimpleConsoleLoggerProvider<T> : ILoggerProvider
public class SimpleConsoleLoggerProvider : ILoggerProvider
{
readonly SimpleConsoleLogger<T> logger;

public SimpleConsoleLoggerProvider()
{
logger = new SimpleConsoleLogger<T>();
}

public ILogger CreateLogger(string categoryName)
{
return logger;
return new SimpleConsoleLogger(categoryName);
}

public void Dispose()
{
}
}

public class SimpleConsoleLogger<T> : ILogger<T>
public class SimpleConsoleLogger(string categoryName) : ILogger
{
public SimpleConsoleLogger()
{
}

public IDisposable? BeginScope<TState>(TState state) where TState : notnull
{
return NullDisposable.Instance;
}

public bool IsEnabled(LogLevel logLevel)
{
return true;
return logLevel != LogLevel.None;
}

public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception? exception, Func<TState, Exception?, string> formatter)
Expand All @@ -45,7 +34,6 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except

var msg = formatter(state, exception);


if (!string.IsNullOrEmpty(msg))
{
Console.WriteLine(msg);
Expand All @@ -69,9 +57,9 @@ public void Dispose()

public static class SimpleConsoleLoggerExtensions
{
public static ILoggingBuilder AddSimpleConsole<T>(this ILoggingBuilder builder)
public static ILoggingBuilder AddSimpleConsole(this ILoggingBuilder builder)
{
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, SimpleConsoleLoggerProvider<T>>());
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, SimpleConsoleLoggerProvider>());
return builder;
}
}
14 changes: 7 additions & 7 deletions src/UnityBuildRunner/Properties/launchSettings.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
{
"profiles": {
"UnityBuildRunner": {
"UnityBuildRunner (help)": {
"commandName": "Project",
"commandLineArgs": ""
"commandLineArgs": "--help"
},
"UnityBuildRunner (unity-path)": {
"commandName": "Project",
"commandLineArgs": "--unity-path \"C:/Program Files/Unity/Hub/Editor/2021.3.17f1/Editor/Unity.exe\" -quit -batchmode -nographics -silent-crashes -logfile log.log -buildTarget StandaloneWindows64 -projectPath ../../../../../sandbox/Sandbox.Unity -executeMethod BuildUnity.BuildGame"
"commandLineArgs": "--unity-path \"C:/Program Files/Unity/Hub/Editor/6000.0.12f1/Editor/Unity.exe\" -quit -batchmode -nographics -silent-crashes -logfile log.log -buildTarget StandaloneWindows64 -projectPath ../../../../../sandbox/Sandbox.Unity -executeMethod BuildUnity.BuildGame"
},
"UnityBuildRunner (env)": {
"commandName": "Project",
Expand All @@ -17,19 +17,19 @@
},
"UnityBuildRunner (-logFile -)": {
"commandName": "Project",
"commandLineArgs": "--unity-path \"C:/Program Files/Unity/Hub/Editor/2021.3.17f1/Editor/Unity.exe\" -quit -batchmode -nographics -silent-crashes -logfile - -buildTarget StandaloneWindows64 -projectPath ../../../../../sandbox/Sandbox.Unity -executeMethod BuildUnity.BuildGame"
"commandLineArgs": "--unity-path \"C:/Program Files/Unity/Hub/Editor/6000.0.12f1/Editor/Unity.exe\" -quit -batchmode -nographics -silent-crashes -logfile - -buildTarget StandaloneWindows64 -projectPath ../../../../../sandbox/Sandbox.Unity -executeMethod BuildUnity.BuildGame"
},
"UnityBuildRunner (quote-slash)": {
"commandName": "Project",
"commandLineArgs": "--unity-path \"C:/Program Files/Unity/Hub/Editor/2021.3.17f1/Editor/Unity.exe\" -quit -batchmode -nographics -silent-crashes -logfile - -buildTarget StandaloneWindows64 -projectPath \"../../../../../sandbox/Sandbox.Unity/\" -executeMethod BuildUnity.BuildGame"
"commandLineArgs": "--unity-path \"C:/Program Files/Unity/Hub/Editor/6000.0.12f1/Editor/Unity.exe\" -quit -batchmode -nographics -silent-crashes -logfile - -buildTarget StandaloneWindows64 -projectPath \"../../../../../sandbox/Sandbox.Unity/\" -executeMethod BuildUnity.BuildGame"
},
"UnityBuildRunner (quote)": {
"commandName": "Project",
"commandLineArgs": "--unity-path \"C:/Program Files/Unity/Hub/Editor/2021.3.17f1/Editor/Unity.exe\" -quit -batchmode -nographics -silent-crashes -logfile - -buildTarget StandaloneWindows64 -projectPath \"..\\..\\..\\..\\..\\sandbox/Sandbox.Unity\\\\\" -executeMethod BuildUnity.BuildGame"
"commandLineArgs": "--unity-path \"C:/Program Files/Unity/Hub/Editor/6000.0.12f1/Editor/Unity.exe\" -quit -batchmode -nographics -silent-crashes -logfile - -buildTarget StandaloneWindows64 -projectPath \"..\\..\\..\\..\\..\\sandbox/Sandbox.Unity\\\\\" -executeMethod BuildUnity.BuildGame"
},
"UnityBuildRunner (quote-bad)": {
"commandName": "Project",
"commandLineArgs": "--unity-path \"C:/Program Files/Unity/Hub/Editor/2021.3.17f1/Editor/Unity.exe\" -quit -batchmode -nographics -silent-crashes -logfile - -buildTarget StandaloneWindows64 -projectPath \"..\\..\\..\\..\\..\\sandbox/Sandbox.Unity\\\" -executeMethod BuildUnity.BuildGame"
"commandLineArgs": "--unity-path \"C:/Program Files/Unity/Hub/Editor/6000.0.12f1/Editor/Unity.exe\" -quit -batchmode -nographics -silent-crashes -logfile - -buildTarget StandaloneWindows64 -projectPath \"..\\..\\..\\..\\..\\sandbox/Sandbox.Unity\\\" -executeMethod BuildUnity.BuildGame"
}
}
}
4 changes: 2 additions & 2 deletions src/UnityBuildRunner/UnityBuildRunner.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@
</PropertyGroup>

<ItemGroup>
<ProjectReference Include="..\UnityBuildRunner.Core\UnityBuildRunner.Core.csproj" />
<PackageReference Include="ConsoleAppFramework" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="ConsoleAppFramework" />
<ProjectReference Include="..\UnityBuildRunner.Core\UnityBuildRunner.Core.csproj" />
</ItemGroup>

</Project>

0 comments on commit fb4e7c5

Please sign in to comment.