From 477ca6923843415c97b02524879e84fdcb3452e6 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 1/2] 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 | 12 +-- .../Tasks/Tasks/InvokeSolutionPackager.cs | 99 +++++++------------ 2 files changed, 39 insertions(+), 72 deletions(-) diff --git a/src/Dataverse/Tasks/TALXIS.DevKit.Build.Dataverse.Tasks.csproj b/src/Dataverse/Tasks/TALXIS.DevKit.Build.Dataverse.Tasks.csproj index d2b008a..5ec13b0 100644 --- a/src/Dataverse/Tasks/TALXIS.DevKit.Build.Dataverse.Tasks.csproj +++ b/src/Dataverse/Tasks/TALXIS.DevKit.Build.Dataverse.Tasks.csproj @@ -23,24 +23,14 @@ - + - - - $(PkgMicrosoft_PowerApps_CLI_Core_linux-x64)\tools\SolutionPackagerLib.dll - true - - - $(PkgMicrosoft_PowerApps_CLI_Core_linux-x64)\tools\System.IO.Packaging.dll - true - - TALXIS 2025 NETWORG diff --git a/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs b/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs index c8b6d04..35feb9e 100644 --- a/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs +++ b/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; -using Microsoft.Crm.Tools.SolutionPackager; +using TALXIS.Platform.Metadata.Packaging; public class InvokeSolutionPackager : Task { @@ -32,15 +32,30 @@ public override bool Execute() { try { - var arguments = BuildArguments(); - if (arguments == null) + var options = BuildOptions(); + if (options == null) { return false; } - var packager = new SolutionPackager(arguments); - packager.Run(); - return true; + var packager = new SolutionPackagerService(); + + switch (Action.ToLowerInvariant()) + { + case "pack": + Log.LogMessage(MessageImportance.High, $"Packing solution from '{SolutionRootDirectory}' to '{PathToZipFile}'..."); + packager.Pack(SolutionRootDirectory, PathToZipFile, options); + Log.LogMessage(MessageImportance.High, "Solution packed successfully."); + return true; + case "unpack": + Log.LogMessage(MessageImportance.High, $"Unpacking solution from '{PathToZipFile}' to '{SolutionRootDirectory}'..."); + packager.Unpack(PathToZipFile, SolutionRootDirectory, options); + Log.LogMessage(MessageImportance.High, "Solution unpacked successfully."); + return true; + default: + Log.LogError($"Unsupported action: {Action}"); + return false; + } } catch (Exception ex) { @@ -56,9 +71,9 @@ public override bool Execute() } } - private PackagerArguments BuildArguments() + private SolutionPackagerOptions? BuildOptions() { - if (!TryParsePackageType(out var packageType)) + if (!TryParseManaged(out var managed)) { return null; } @@ -69,75 +84,37 @@ private PackagerArguments BuildArguments() return null; } - PackagerArguments arguments; - - switch (Action.ToLowerInvariant()) - { - case "pack": - arguments = new PackagerArguments - { - Action = CommandAction.Pack, - PathToZipFile = PathToZipFile, - Folder = SolutionRootDirectory, - PackageType = packageType, - ErrorLevel = errorLevel, - Localize = Localize, - UseUnmanagedFileForManaged = UseUnmanagedFileForMissingManaged, - }; - break; - case "unpack": - arguments = new PackagerArguments - { - Action = CommandAction.Extract, - PathToZipFile = PathToZipFile, - Folder = SolutionRootDirectory, - PackageType = packageType, - AllowDeletes = AllowDelete.Yes, - AllowWrites = AllowWrite.Yes, - ErrorLevel = errorLevel, - Localize = Localize, - }; - break; - default: - Log.LogError($"Unsupported action: {Action}"); - return null; - } - - if (!string.IsNullOrWhiteSpace(MappingFilePath)) + return new SolutionPackagerOptions { - arguments.MappingFile = MappingFilePath; - } - - if (!string.IsNullOrWhiteSpace(LogFilePath)) - { - arguments.LogFile = LogFilePath; - } - - if (!string.IsNullOrWhiteSpace(LocalTemplate)) - { - arguments.LocaleTemplate = LocalTemplate; - } - - return arguments; + Managed = managed, + ErrorLevel = errorLevel, + LogFilePath = LogFilePath, + MappingFilePath = MappingFilePath, + Localize = Localize, + SourceLocale = LocalTemplate, + UseUnmanagedFileForMissingManaged = UseUnmanagedFileForMissingManaged, + AllowDeletes = true, + AllowWrites = true + }; } - private bool TryParsePackageType(out SolutionPackageType packageType) + private bool TryParseManaged(out bool managed) { if (string.IsNullOrWhiteSpace(PackageType) || string.Equals(PackageType, "Unmanaged", StringComparison.OrdinalIgnoreCase)) { - packageType = SolutionPackageType.Unmanaged; + managed = false; return true; } if (string.Equals(PackageType, "Managed", StringComparison.OrdinalIgnoreCase)) { - packageType = SolutionPackageType.Managed; + managed = true; return true; } Log.LogError($"Unsupported package type: {PackageType}"); - packageType = default; + managed = false; return false; } } From a2ed018e27b9c28917ac76889ff4559f5015c061 Mon Sep 17 00:00:00 2001 From: Tomas Prokop Date: Fri, 12 Jun 2026 12:52:26 +0200 Subject: [PATCH 2/2] fix: preserve task option mapping semantics Normalize optional SolutionPackager paths to null/omitted values and only opt into unpack-specific delete/write flags when running unpack so the MSBuild task continues to mirror the previous argument semantics. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Tasks/Tasks/InvokeSolutionPackager.cs | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs b/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs index 35feb9e..19f547d 100644 --- a/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs +++ b/src/Dataverse/Tasks/Tasks/InvokeSolutionPackager.cs @@ -71,7 +71,7 @@ public override bool Execute() } } - private SolutionPackagerOptions? BuildOptions() + private SolutionPackagerOptions BuildOptions() { if (!TryParseManaged(out var managed)) { @@ -84,18 +84,36 @@ public override bool Execute() return null; } - return new SolutionPackagerOptions + var options = new SolutionPackagerOptions { Managed = managed, ErrorLevel = errorLevel, - LogFilePath = LogFilePath, - MappingFilePath = MappingFilePath, Localize = Localize, - SourceLocale = LocalTemplate, UseUnmanagedFileForMissingManaged = UseUnmanagedFileForMissingManaged, - AllowDeletes = true, - AllowWrites = true }; + + if (!string.IsNullOrWhiteSpace(LogFilePath)) + { + options.LogFilePath = LogFilePath; + } + + if (!string.IsNullOrWhiteSpace(MappingFilePath)) + { + options.MappingFilePath = MappingFilePath; + } + + if (!string.IsNullOrWhiteSpace(LocalTemplate)) + { + options.SourceLocale = LocalTemplate; + } + + if (string.Equals(Action, "unpack", StringComparison.OrdinalIgnoreCase)) + { + options.AllowDeletes = true; + options.AllowWrites = true; + } + + return options; } private bool TryParseManaged(out bool managed)