diff --git a/src/lib-csharp/VelopackAsset.cs b/src/lib-csharp/VelopackAsset.cs index 291a9969..597249b5 100644 --- a/src/lib-csharp/VelopackAsset.cs +++ b/src/lib-csharp/VelopackAsset.cs @@ -20,8 +20,8 @@ namespace Velopack Portable = 3, /// An application installer archive. Installer = 4, - /// A Windows Installer package (.msi) for the application. - Msi = 5, + /// A Windows Installer package (.msi) for the deployment tool. + MsiDeploymentTool = 5 } /// diff --git a/src/vpk/Velopack.Packaging.Unix/Commands/LinuxPackOptions.cs b/src/vpk/Velopack.Packaging.Unix/Commands/LinuxPackOptions.cs index f05a56a5..19c0fa45 100644 --- a/src/vpk/Velopack.Packaging.Unix/Commands/LinuxPackOptions.cs +++ b/src/vpk/Velopack.Packaging.Unix/Commands/LinuxPackOptions.cs @@ -37,5 +37,4 @@ public class LinuxPackOptions : IPackOptions public string Categories { get; set; } public string Compression { get; set; } - public bool BuildMsi => false; } diff --git a/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackCommandRunner.cs b/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackCommandRunner.cs index a36cb5fd..072880e2 100644 --- a/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackCommandRunner.cs +++ b/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackCommandRunner.cs @@ -119,7 +119,7 @@ public class OsxPackCommandRunner : PackageBuilder return Task.CompletedTask; } - protected override Task CreateSetupPackage(Action progress, string releasePkg, string packDir, string pkgPath) + protected override Task CreateSetupPackage(Action progress, string releasePkg, string packDir, string pkgPath, Func createAsset) { // create installer package, sign and notarize if (!Options.NoInst) { diff --git a/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackOptions.cs b/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackOptions.cs index 8bc7d081..9db24541 100644 --- a/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackOptions.cs +++ b/src/vpk/Velopack.Packaging.Unix/Commands/OsxPackOptions.cs @@ -35,5 +35,4 @@ public class OsxPackOptions : OsxBundleOptions, IPackOptions public string Channel { get; set; } public string Exclude { get; set; } - public bool BuildMsi => false; } diff --git a/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs b/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs index 86ed2163..0e59926f 100644 --- a/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs +++ b/src/vpk/Velopack.Packaging.Windows/Commands/WindowsPackCommandRunner.cs @@ -183,11 +183,24 @@ public class WindowsPackCommandRunner : PackageBuilder return String.Join(",", validated); } - protected override Task CreateSetupPackage(Action progress, string releasePkg, string packDir, string targetSetupExe) + protected override Task CreateSetupPackage(Action progress, string releasePkg, string packDir, string targetSetupExe, Func createAsset) { + void setupExeProgress(int x) + { + if (Options.BuildMsi) { + progress(x / 2); + } else { + progress(x); + } + } + void msiProgress(int value) + { + progress(50 + value / 2); + } + var bundledZip = new ZipPackage(releasePkg); IoUtil.Retry(() => File.Copy(HelperFile.SetupPath, targetSetupExe, true)); - progress(10); + setupExeProgress(10); var editor = new ResourceEdit(targetSetupExe, Log); editor.SetVersionInfo(bundledZip); @@ -197,14 +210,20 @@ public class WindowsPackCommandRunner : PackageBuilder editor.Commit(); - progress(25); + setupExeProgress(25); Log.Debug($"Creating Setup bundle"); SetupBundle.CreatePackageBundle(targetSetupExe, releasePkg); - progress(50); + setupExeProgress(50); Log.Debug("Signing Setup bundle"); - SignFilesImpl(CoreUtil.CreateProgressDelegate(progress, 50, 100), targetSetupExe); + SignFilesImpl(CoreUtil.CreateProgressDelegate( setupExeProgress, 50, 100), targetSetupExe); Log.Debug($"Setup bundle created '{Path.GetFileName(targetSetupExe)}'."); - progress(100); + setupExeProgress(100); + + if (Options.BuildMsi && VelopackRuntimeInfo.IsWindows) { + var msiName = DefaultName.GetSuggestedMsiName(Options.PackId, Options.Channel, TargetOs); + var msiPath = createAsset(msiName, VelopackAssetType.MsiDeploymentTool); + CompileWixTemplateToMsi(msiProgress, targetSetupExe, msiPath); + } return Task.CompletedTask; } @@ -241,13 +260,6 @@ public class WindowsPackCommandRunner : PackageBuilder return dict; } - protected override Task CreateMsiPackage(Action progress, string setupExePath, string msiPath) - { - if (VelopackRuntimeInfo.IsWindows) { - CompileWixTemplateToMsi(progress, setupExePath, msiPath); - } - return Task.CompletedTask; - } private void CreateExecutableStubForExe(string exeToCopy, string targetStubPath) { diff --git a/src/vpk/Velopack.Packaging/Abstractions/IPackOptions.cs b/src/vpk/Velopack.Packaging/Abstractions/IPackOptions.cs index 9d37a5e7..9b2fb687 100644 --- a/src/vpk/Velopack.Packaging/Abstractions/IPackOptions.cs +++ b/src/vpk/Velopack.Packaging/Abstractions/IPackOptions.cs @@ -9,5 +9,4 @@ public interface IPackOptions : INugetPackCommand, IPlatformOptions string Exclude { get; set; } bool NoPortable { get; set; } bool NoInst { get; set; } - bool BuildMsi { get; } } diff --git a/src/vpk/Velopack.Packaging/PackageBuilder.cs b/src/vpk/Velopack.Packaging/PackageBuilder.cs index 864b3a03..86b7d0d6 100644 --- a/src/vpk/Velopack.Packaging/PackageBuilder.cs +++ b/src/vpk/Velopack.Packaging/PackageBuilder.cs @@ -29,7 +29,7 @@ public abstract class PackageBuilder : ICommand protected Dictionary ExtraNuspecMetadata { get; } = new(); - private readonly Regex REGEX_EXCLUDES = new Regex(@".*[\\\/]createdump.*|.*\.vshost\..*|.*\.nupkg$", RegexOptions.IgnoreCase | RegexOptions.Compiled); + private readonly Regex REGEX_EXCLUDES = new(@".*[\\\/]createdump.*|.*\.vshost\..*|.*\.nupkg$", RegexOptions.IgnoreCase | RegexOptions.Compiled); public PackageBuilder(RuntimeOs supportedOs, ILogger logger, IFancyConsole console) { @@ -148,14 +148,13 @@ public abstract class PackageBuilder : ICommand }); Task setupTask = null; - string setupExePath = null; if (!Options.NoInst && TargetOs != RuntimeOs.Linux) { setupTask = ctx.RunTask( "Building setup package", async (progress) => { var suggestedName = DefaultName.GetSuggestedSetupName(packId, channel, TargetOs); - var path = setupExePath = assetCache.MakeAssetPath(suggestedName, VelopackAssetType.Installer); - await CreateSetupPackage(progress, releasePath, packDirectory, path); + var path = assetCache.MakeAssetPath(suggestedName, VelopackAssetType.Installer); + await CreateSetupPackage(progress, releasePath, packDirectory, path, assetCache.MakeAssetPath); }); } @@ -177,16 +176,6 @@ public abstract class PackageBuilder : ICommand if (TargetOs != RuntimeOs.Linux && portableTask != null) await portableTask; if (setupTask != null) await setupTask; - if (!Options.NoInst && Options.BuildMsi && TargetOs == RuntimeOs.Windows) { - await ctx.RunTask( - "Building MSI package", - async (progress) => { - var msiName = DefaultName.GetSuggestedMsiName(packId, channel, TargetOs); - var msiPath = assetCache.MakeAssetPath(msiName, VelopackAssetType.Msi); - await CreateMsiPackage(progress, setupExePath, msiPath); - }); - } - await ctx.RunTask( "Post-process steps", (progress) => { @@ -282,12 +271,7 @@ public abstract class PackageBuilder : ICommand return Task.FromResult(dp.PackageFile); } - protected virtual Task CreateSetupPackage(Action progress, string releasePkg, string packDir, string outputPath) - { - return Task.CompletedTask; - } - - protected virtual Task CreateMsiPackage(Action progress, string setupExePath, string msiPath) + protected virtual Task CreateSetupPackage(Action progress, string releasePkg, string packDir, string outputPath, Func createAsset) { return Task.CompletedTask; } @@ -313,10 +297,7 @@ public abstract class PackageBuilder : ICommand progress(100); } - protected virtual Dictionary GetReleaseMetadataFiles() - { - return new Dictionary(); - } + protected virtual Dictionary GetReleaseMetadataFiles() => []; protected virtual void CopyFiles(DirectoryInfo source, DirectoryInfo target, Action progress, bool excludeAnnoyances = false) { @@ -364,7 +345,7 @@ public abstract class PackageBuilder : ICommand // copy the contents of the folder, not the folder itself. var src = source.FullName.TrimEnd('/') + "/."; var dest = target.FullName.TrimEnd('/') + "/"; - Log.Debug(Exe.InvokeAndThrowIfNonZero("cp", new[] { "-a", src, dest }, null)); + Log.Debug(Exe.InvokeAndThrowIfNonZero("cp", ["-a", src, dest], null)); if (excludeAnnoyances) { foreach (var f in target.EnumerateFiles("*", SearchOption.AllDirectories)) { diff --git a/src/vpk/Velopack.Vpk/Commands/Packaging/WindowsPackCommand.cs b/src/vpk/Velopack.Vpk/Commands/Packaging/WindowsPackCommand.cs index b803f60d..8079bc06 100644 --- a/src/vpk/Velopack.Vpk/Commands/Packaging/WindowsPackCommand.cs +++ b/src/vpk/Velopack.Vpk/Commands/Packaging/WindowsPackCommand.cs @@ -76,8 +76,7 @@ public class WindowsPackCommand : PackCommand AddOption((v) => BuildMsi = v, "--msi") .SetDescription("Compile a .msi machine-wide deployment tool.") - .SetHidden() - .SetArgumentHelpName("BITNESS"); + .SetHidden(); AddOption((v) => MsiVersionOverride = v, "--msiVersion") .SetDescription("Override the product version for the generated msi.") diff --git a/test/Velopack.Packaging.Tests/WindowsPackTests.cs b/test/Velopack.Packaging.Tests/WindowsPackTests.cs index f47bcc86..5db53d95 100644 --- a/test/Velopack.Packaging.Tests/WindowsPackTests.cs +++ b/test/Velopack.Packaging.Tests/WindowsPackTests.cs @@ -13,7 +13,6 @@ using Velopack.Util; using Velopack.Vpk; using Velopack.Vpk.Logging; using Velopack.Windows; -using static Azure.Core.HttpHeader; namespace Velopack.Packaging.Tests;