From 26bd980934807503d1796394e0aa22e86e375cf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C4=9Bj=20Samler?= Date: Thu, 7 May 2026 18:27:45 +0200 Subject: [PATCH] feat: use TALXIS.Platform.Metadata.Packaging library for solution pack/unpack On .NET 10+ (MSBuildRuntimeType=Core), InvokeSolutionPackager now uses the TALXIS.Platform.Metadata.Packaging library directly instead of shelling out to PAC CLI. This eliminates the PAC CLI runtime dependency and provides faster, more reliable solution packing/unpacking. On .NET Framework (net472), the PAC CLI fallback is retained since the packaging library targets net10.0. Also upgrades Tasks TFM from net472;net6.0 to net472;net10.0 and updates the .targets assembly path accordingly. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- ...TALXIS.DevKit.Build.Dataverse.Tasks.csproj | 3 +- .../Tasks/Tasks/InvokeSolutionPackager.cs | 111 ++++++++++++++---- ...ALXIS.DevKit.Build.Dataverse.Tasks.targets | 2 +- 3 files changed, 88 insertions(+), 28 deletions(-) diff --git a/src/Dataverse/Tasks/TALXIS.DevKit.Build.Dataverse.Tasks.csproj b/src/Dataverse/Tasks/TALXIS.DevKit.Build.Dataverse.Tasks.csproj index b17d361..d331dc3 100644 --- a/src/Dataverse/Tasks/TALXIS.DevKit.Build.Dataverse.Tasks.csproj +++ b/src/Dataverse/Tasks/TALXIS.DevKit.Build.Dataverse.Tasks.csproj @@ -4,7 +4,7 @@ TALXIS.DevKit.Build.Dataverse.Tasks - net472;net6.0 + net472;net10.0 true true @@ -30,6 +30,7 @@ + diff --git a/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs b/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs index 0f83835..fd22d35 100644 --- a/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs +++ b/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs @@ -30,6 +30,86 @@ public class InvokeSolutionPackager : Task public bool UseUnmanagedFileForMissingManaged { get; set; } + public override bool Execute() + { +#if NET10_0_OR_GREATER + return ExecuteWithLibrary(); +#else + return ExecuteWithPacCli(); +#endif + } + +#if NET10_0_OR_GREATER + private bool ExecuteWithLibrary() + { + try + { + var packagerService = new TALXIS.Platform.Metadata.Packaging.SolutionPackagerService(); + var managed = string.Equals(PackageType, "Managed", StringComparison.OrdinalIgnoreCase); + + var options = new TALXIS.Platform.Metadata.Packaging.SolutionPackagerOptions + { + Managed = managed, + Localize = Localize, + UseUnmanagedFileForMissingManaged = UseUnmanagedFileForMissingManaged, + MappingFilePath = MappingFilePath, + LogFilePath = LogFilePath, + SourceLocale = LocalTemplate + }; + + if (!string.IsNullOrWhiteSpace(ErrorLevel) && + Enum.TryParse(ErrorLevel, true, out var traceLevel)) + { + options.ErrorLevel = traceLevel; + } + + switch (Action.ToLower()) + { + case "pack": + Log.LogMessage(MessageImportance.High, $"Packing solution from '{SolutionRootDirectory}' to '{PathToZipFile}'..."); + packagerService.Pack(SolutionRootDirectory, PathToZipFile, options); + Log.LogMessage(MessageImportance.High, "Solution packed successfully."); + break; + case "unpack": + Log.LogMessage(MessageImportance.High, $"Unpacking solution from '{PathToZipFile}' to '{SolutionRootDirectory}'..."); + packagerService.Unpack(PathToZipFile, SolutionRootDirectory, options); + Log.LogMessage(MessageImportance.High, "Solution unpacked successfully."); + break; + default: + Log.LogError($"Unsupported action: {Action}"); + return false; + } + + return true; + } + catch (Exception ex) + { + Log.LogError($"Solution {Action.ToLower()} failed: {ex.Message}"); + return false; + } + } +#endif + +#if !NET10_0_OR_GREATER + private bool ExecuteWithPacCli() + { + var pacPath = ResolvePACFilePath(); + if (pacPath == null) + { + Log.LogError("The pac tool is not found. Please install it using 'dotnet tool install --global Microsoft.PowerApps.CLI.Tool'"); + return false; + } + + var args = BuildArguments(); + if (string.IsNullOrWhiteSpace(args)) + { + Log.LogError("Failed to build arguments for pac command."); + return false; + } + + return RunCommand(pacPath, args); + } + private string ResolvePACFilePath() { bool isWindows = Environment.OSVersion.Platform == PlatformID.Win32NT; @@ -38,7 +118,6 @@ private string ResolvePACFilePath() ? new[] { "pac.exe", "pac.cmd" } : new[] { "pac" }; - // Check the standalone Power Platform CLI location first (preferred, supports latest versions) if (isWindows) { var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); @@ -50,7 +129,6 @@ private string ResolvePACFilePath() } } - // Check the standard global tools location var toolsDir = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".dotnet", "tools"); @@ -62,13 +140,12 @@ private string ResolvePACFilePath() return globalToolPath; } - // Fall back to searching PATH var pathEnv = Environment.GetEnvironmentVariable("PATH"); - + if (!string.IsNullOrEmpty(pathEnv)) { var separator = isWindows ? ';' : ':'; - + foreach (var name in candidates) { var found = pathEnv.Split(new[] { separator }, StringSplitOptions.RemoveEmptyEntries) @@ -85,25 +162,6 @@ private string ResolvePACFilePath() return null; } - public override bool Execute() - { - var pacPath = ResolvePACFilePath(); - if (pacPath == null) - { - Log.LogError("The pac tool is not found. Please install it using 'dotnet tool install --global Microsoft.PowerApps.CLI.Tool'"); - return false; - } - - var args = BuildArguments(); - if (string.IsNullOrWhiteSpace(args)) - { - Log.LogError("Failed to build arguments for pac command."); - return false; - } - - return RunCommand(pacPath, args); - } - private string BuildArguments() { string args = string.Empty; @@ -153,8 +211,8 @@ private bool RunCommand(string fileName, string arguments) { try { - var stdoutLines = new System.Collections.Generic.List(); - var stderrLines = new System.Collections.Generic.List(); + var stdoutLines = new List(); + var stderrLines = new List(); ProcessStartInfo processStartInfo = new ProcessStartInfo { @@ -240,4 +298,5 @@ private bool RunCommand(string fileName, string arguments) return false; } } +#endif } diff --git a/src/Dataverse/Tasks/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Tasks.targets b/src/Dataverse/Tasks/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Tasks.targets index f2f437b..0927bf0 100644 --- a/src/Dataverse/Tasks/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Tasks.targets +++ b/src/Dataverse/Tasks/msbuild/tasks/TALXIS.DevKit.Build.Dataverse.Tasks.targets @@ -6,7 +6,7 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - $(MSBuildThisFileDirectory)net6.0\ + $(MSBuildThisFileDirectory)net10.0\ $(MSBuildThisFileDirectory)net472\