From 930b7d46befb1ddf9921525e959d713fb81e0e9f Mon Sep 17 00:00:00 2001 From: Ikiru Yoshizaki <3856350+guitarrapc@users.noreply.github.com> Date: Fri, 7 Feb 2025 02:52:36 +0900 Subject: [PATCH] feat: bump ConsoleAppFramework v5 --- Directory.Build.props | 1 + Directory.Packages.props | 2 +- src/UnityBuildRunner.Core/DefaultBuilder.cs | 8 +--- src/UnityBuildRunner.Core/DefaultSettings.cs | 42 +++++++++++------ src/UnityBuildRunner/Program.cs | 46 +++++++++++-------- .../Properties/launchSettings.json | 12 ++--- src/UnityBuildRunner/UnityBuildRunner.csproj | 5 +- 7 files changed, 69 insertions(+), 47 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index e2e8f9f..c61342c 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,7 @@ net8.0 + Latest enable enable diff --git a/Directory.Packages.props b/Directory.Packages.props index 21e0983..5379315 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,7 +3,7 @@ true - + diff --git a/src/UnityBuildRunner.Core/DefaultBuilder.cs b/src/UnityBuildRunner.Core/DefaultBuilder.cs index 6c8b37e..ea92e4a 100644 --- a/src/UnityBuildRunner.Core/DefaultBuilder.cs +++ b/src/UnityBuildRunner.Core/DefaultBuilder.cs @@ -55,13 +55,7 @@ Starting Unity Build. WorkingDirectory = settings.WorkingDirectory, UseShellExecute = false, CreateNoWindow = true, - }); - - if (process is null) - { - throw new OperationCanceledException("Could not start Unity. Somthing blocked creating process."); - } - + }) ?? throw new OperationCanceledException("Could not start Unity. Somthing blocked creating process."); var unityProcessExitCode = 0; try { diff --git a/src/UnityBuildRunner.Core/DefaultSettings.cs b/src/UnityBuildRunner.Core/DefaultSettings.cs index e85db2b..5fbd679 100644 --- a/src/UnityBuildRunner.Core/DefaultSettings.cs +++ b/src/UnityBuildRunner.Core/DefaultSettings.cs @@ -91,7 +91,7 @@ public CancellationTokenSource CreateCancellationTokenSource(CancellationToken? /// /// Parse args and create . /// - public static bool TryParse(IReadOnlyList args, string unityPath, TimeSpan timeout, [NotNullWhen(true)] out DefaultSettings? settings) + public static bool TryParse(ReadOnlySpan args, string unityPath, TimeSpan timeout, [NotNullWhen(true)] out DefaultSettings? settings) { try { @@ -108,32 +108,38 @@ public static bool TryParse(IReadOnlyList args, string unityPath, TimeSp /// /// Parse args and create . /// - public static DefaultSettings Parse(IReadOnlyList args, string unityPath, TimeSpan timeout) + public static DefaultSettings Parse(ReadOnlySpan args, string unityPath, TimeSpan timeout) { // Unity Path - var unityPathFixed = !string.IsNullOrWhiteSpace(unityPath) ? unityPath : Environment.GetEnvironmentVariable(ISettings.UNITY_PATH_ENVVAR_KEY) ?? throw new ArgumentNullException($"Unity Path not specified. Please pass Unity Executable path with argument '--unity-path' or environment variable '{ISettings.UNITY_PATH_ENVVAR_KEY}'."); + var unityPathFixed = !string.IsNullOrWhiteSpace(unityPath) + ? unityPath + : Environment.GetEnvironmentVariable(ISettings.UNITY_PATH_ENVVAR_KEY) ?? throw new ArgumentNullException($"Unity Path not specified. Please pass Unity Executable path with argument '--unity-path' or environment variable '{ISettings.UNITY_PATH_ENVVAR_KEY}'."); // parse and fallback logfilePath + var arguments = args.ToArray().ToList(); // muda of muda var logFilePath = ParseLogFile(args); if (!IsValidLogFileName(logFilePath)) { var inputLogFilePath = logFilePath; logFilePath = "unitybuild.log"; + // remove current `-logFile "-"` and replace to `-logFile unitybuild.log` - var tmpArgs = string.IsNullOrEmpty(logFilePath) - ? args.Except(new[] { "-logFile" }, StringComparer.OrdinalIgnoreCase).Concat(new[] { "-logFile", logFilePath }) - : args.Except(new[] { "-logFile" }, StringComparer.OrdinalIgnoreCase).Except(new[] { inputLogFilePath }).Concat(new[] { "-logFile", logFilePath }); - args = tmpArgs.ToArray(); + RemoveArgument(arguments, "-logFile"); + RemoveArgument(arguments, inputLogFilePath); + + // add new logFile argument + arguments.Add("-logFile"); + arguments.Add(logFilePath); } - var arguments = args.Where(x => !string.IsNullOrWhiteSpace(x)).ToArray(); - var argumentString = string.Join(" ", arguments.Select(s => s.AsSpan()[0] == '-' ? s : QuoteString(s))); + var noEmptyArray = arguments.Where(x => !string.IsNullOrWhiteSpace(x)); + var argumentString = string.Join(" ", noEmptyArray.Select(s => s.AsSpan()[0] == '-' ? s : QuoteString(s))); // WorkingDirectory should be cli launch path. var workingDirectory = Directory.GetCurrentDirectory(); // Create settings - var settings = new DefaultSettings(arguments, argumentString, unityPathFixed, logFilePath, workingDirectory, timeout, TimeProvider.System); + var settings = new DefaultSettings([.. noEmptyArray], argumentString, unityPathFixed, logFilePath, workingDirectory, timeout, TimeProvider.System); // Validate settings settings.Validate(); @@ -141,6 +147,16 @@ public static DefaultSettings Parse(IReadOnlyList args, string unityPath return settings; } + private static void RemoveArgument(List args, string argument) + { + var index = args.FindIndex(x => string.Equals(x, argument, StringComparison.OrdinalIgnoreCase)); + if (index >= 0) + { + args.RemoveAt(index); + } + } + + /// /// QuoteString when possible. /// @@ -196,12 +212,12 @@ internal static string QuoteString(string text) /// /// /// - internal static string ParseLogFile(IReadOnlyList args) + internal static string ParseLogFile(ReadOnlySpan args) { var logFile = ""; - for (var i = 0; i < args.Count; i++) + for (var i = 0; i < args.Length; i++) { - if (string.Equals(args[i], "-logFile", StringComparison.OrdinalIgnoreCase) && i + 1 < args.Count) + if (string.Equals(args[i], "-logFile", StringComparison.OrdinalIgnoreCase) && i + 1 < args.Length) { logFile = args[i + 1]; break; diff --git a/src/UnityBuildRunner/Program.cs b/src/UnityBuildRunner/Program.cs index 8e9b8ae..28a31c6 100644 --- a/src/UnityBuildRunner/Program.cs +++ b/src/UnityBuildRunner/Program.cs @@ -1,38 +1,46 @@ +using ConsoleAppFramework; using Microsoft.Extensions.Logging; using UnityBuildRunner.Core; -var builder = ConsoleApp.CreateBuilder(args); -var app = builder.Build(); -app.AddCommands(); -app.Run(); +var app = ConsoleApp.Create(); +app.ConfigureLogging(logging => +{ + logging.ClearProviders(); + logging.AddSimpleConsole(); +}); +app.Add(); +await app.RunAsync(args); -public class UnityBuildRunnerCommand(ILogger logger) : ConsoleAppBase +internal class UnityBuildRunnerCommand(ILogger logger) { private const string DefaultTimeout = "02:00:00"; // 2 hours private readonly TimeSpan timeoutDefault = TimeSpan.Parse(DefaultTimeout); - [RootCommand] - public async Task Run([Option("--unity-path", "Full Path to the Unity executable, leave empty when use 'UnityPath' Environment variables instead.")] string unityPath = "", [Option("--timeout", "Timeout for Unity Build.")] string timeout = DefaultTimeout) + /// + /// + /// + /// Accesing to batch context. + /// Full Path to the Unity executable, leave empty when use 'UnityPath' Environment variables instead. + /// Timeout for Unity Build. + /// CancellationToken to cancel command when Ctrl+C pressed. + /// + /// + [Command("")] + public async Task Run(ConsoleAppContext context, string unityPath = "", string timeout = DefaultTimeout, CancellationToken cancellationToken = default) { - var arguments = Context.Arguments - .Except(["--timeout", timeout]); - if (!string.IsNullOrEmpty(unityPath)) + var args = context.EscapedArguments; + if (args.Length == 0) { - arguments = arguments.Except(["--unity-path", unityPath]); - } - var args = arguments?.ToArray(); - - if (args is null || args.Length == 0) - { - throw new ArgumentOutOfRangeException($"No valid argument found, exiting. You have specified arguments: {string.Join(" ", args ?? [])}"); + throw new ArgumentOutOfRangeException($"No valid argument found, exiting. You have specified arguments: {string.Join(" ", context.Arguments)}"); } // build var timeoutSpan = TimeSpan.TryParse(timeout, out var r) ? r : timeoutDefault; - var settings = DefaultSettings.Parse(args!, unityPath, timeoutSpan); - using var cts = settings.CreateCancellationTokenSource(Context.CancellationToken); + var settings = DefaultSettings.Parse(args, unityPath, timeoutSpan); + using var cts = settings.CreateCancellationTokenSource(cancellationToken); + // build var builder = new DefaultBuilder(settings, logger); await builder.BuildAsync(cts.Token); return builder.ExitCode; diff --git a/src/UnityBuildRunner/Properties/launchSettings.json b/src/UnityBuildRunner/Properties/launchSettings.json index 306f7d4..d0160d5 100644 --- a/src/UnityBuildRunner/Properties/launchSettings.json +++ b/src/UnityBuildRunner/Properties/launchSettings.json @@ -6,30 +6,30 @@ }, "UnityBuildRunner (unity-path)": { "commandName": "Project", - "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" + "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", - "commandLineArgs": "-quit -batchmode -nographics -silent-crashes -logfile log.log -buildTarget StandaloneWindows64 -projectPath ../../../../../sandbox/Sandbox.Unity -executeMethod BuildUnity.BuildGame", + "commandLineArgs": "-- -quit -batchmode -nographics -silent-crashes -logfile log.log -buildTarget StandaloneWindows64 -projectPath ../../../../../sandbox/Sandbox.Unity -executeMethod BuildUnity.BuildGame", "environmentVariables": { "UnityPath": "C:\\Program Files\\Unity\\Hub\\Editor\\2021.3.17f1\\Editor\\Unity.exe" } }, "UnityBuildRunner (-logFile -)": { "commandName": "Project", - "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" + "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/6000.0.12f1/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/6000.0.12f1/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/6000.0.12f1/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" } } } diff --git a/src/UnityBuildRunner/UnityBuildRunner.csproj b/src/UnityBuildRunner/UnityBuildRunner.csproj index 5da7f6b..1dd2090 100644 --- a/src/UnityBuildRunner/UnityBuildRunner.csproj +++ b/src/UnityBuildRunner/UnityBuildRunner.csproj @@ -11,7 +11,10 @@ - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive +