Removes MSI deployment tool feature

Removes the option to build a separate MSI deployment tool.
This simplifies the packaging process and reduces the number of artifacts produced.
The functionality is deemed redundant and not widely used.
This commit is contained in:
Kevin Bost
2025-04-08 00:33:40 -07:00
parent 8cfec1003b
commit f97605971d
20 changed files with 4 additions and 178 deletions

View File

@@ -20,10 +20,8 @@ namespace Velopack
Portable = 3, Portable = 3,
/// <summary> An application installer archive. </summary> /// <summary> An application installer archive. </summary>
Installer = 4, Installer = 4,
/// <summary> A Windows Installer package (.msi) for the deployment tool.</summary>
MsiDeploymentTool = 5,
/// <summary> A Windows Installer package (.msi).</summary> /// <summary> A Windows Installer package (.msi).</summary>
Msi = 6, Msi = 5,
} }
/// <summary> /// <summary>

View File

@@ -103,7 +103,6 @@ public class PackTask : MSBuildAsyncTask
public string? Compression { get; set; } public string? Compression { get; set; }
public bool BuildMsiDeploymentTool { get; set; }
public bool BuildMsi { get; set; } public bool BuildMsi { get; set; }
public string? MsiVersionOverride { get; set; } public string? MsiVersionOverride { get; set; }

View File

@@ -220,12 +220,6 @@ public class WindowsPackCommandRunner : PackageBuilder<WindowsPackOptions>
Log.Debug($"Setup bundle created '{Path.GetFileName(targetSetupExe)}'."); Log.Debug($"Setup bundle created '{Path.GetFileName(targetSetupExe)}'.");
setupExeProgress(100); setupExeProgress(100);
if (Options.BuildMsiDeploymentTool && VelopackRuntimeInfo.IsWindows) {
var msiName = DefaultName.GetSuggestedMsiDeploymentToolName(Options.PackId, Options.Channel, TargetOs);
var msiPath = createAsset(msiName, VelopackAssetType.MsiDeploymentTool);
CompileWixTemplateToMsiDeploymentTool(msiProgress, targetSetupExe, msiPath);
}
if (Options.BuildMsi && VelopackRuntimeInfo.IsWindows) { if (Options.BuildMsi && VelopackRuntimeInfo.IsWindows) {
var msiName = DefaultName.GetSuggestedMsiName(Options.PackId, Options.Channel, TargetOs); var msiName = DefaultName.GetSuggestedMsiName(Options.PackId, Options.Channel, TargetOs);
var msiPath = createAsset(msiName, VelopackAssetType.Msi); var msiPath = createAsset(msiName, VelopackAssetType.Msi);
@@ -730,83 +724,6 @@ public class WindowsPackCommandRunner : PackageBuilder<WindowsPackOptions>
} }
} }
[SupportedOSPlatform("windows")]
private void CompileWixTemplateToMsiDeploymentTool(Action<int> progress,
string setupExePath, string msiFilePath)
{
bool packageAs64Bit =
Options.TargetRuntime.Architecture is RuntimeCpu.x64 or RuntimeCpu.arm64;
Log.Info($"Compiling machine-wide msi deployment tool in {(packageAs64Bit ? "64-bit" : "32-bit")} mode");
var outputDirectory = Path.GetDirectoryName(setupExePath);
var setupName = Path.GetFileNameWithoutExtension(setupExePath);
var culture = CultureInfo.GetCultureInfo("en-US").TextInfo.ANSICodePage;
// WiX Identifiers may contain ASCII characters A-Z, a-z, digits, underscores (_), or
// periods(.). Every identifier must begin with either a letter or an underscore.
var wixId = Regex.Replace(Options.PackId, @"[^\w\.]", "_");
if (char.GetUnicodeCategory(wixId[0]) == UnicodeCategory.DecimalDigitNumber)
wixId = "_" + wixId;
Regex stacheRegex = new(@"\{\{(?<key>[^\}]+)\}\}", RegexOptions.Compiled);
var wxsFile = Path.Combine(outputDirectory, wixId + ".wxs");
var objFile = Path.Combine(outputDirectory, wixId + ".wixobj");
var msiVersion = Options.MsiVersionOverride;
if (string.IsNullOrWhiteSpace(msiVersion)) {
var parsedVersion = SemanticVersion.Parse(Options.PackVersion);
msiVersion = $"{parsedVersion.Major}.{parsedVersion.Minor}.{parsedVersion.Patch}.0";
}
try {
// apply dictionary to wsx template
var templateText = File.ReadAllText(HelperFile.WixTemplatePath);
var templateResult = stacheRegex.Replace(templateText, match => {
string key = match.Groups["key"].Value;
return key switch {
"Id" => wixId,
"Title" => GetEffectiveTitle(),
"Author" => GetEffectiveAuthors(),
"Version" => msiVersion,
"Summary" => GetEffectiveTitle(),
"Codepage" => $"{culture}",
"Platform" => packageAs64Bit ? "x64" : "x86",
"ProgramFilesFolder" => packageAs64Bit ? "ProgramFiles64Folder" : "ProgramFilesFolder",
"Win64YesNo" => packageAs64Bit ? "yes" : "no",
"SetupName" => setupName,
_ when key.StartsWith("IdAsGuid", StringComparison.OrdinalIgnoreCase) => GuidUtil.CreateGuidFromHash($"{Options.PackId}:{key.Substring("IdAsGuid".Length)}").ToString(),
_ => match.Value,
};
});
File.WriteAllText(wxsFile, templateResult, Encoding.UTF8);
// Candle preprocesses and compiles WiX source files into object files (.wixobj).
Log.Info("Compiling WiX Template (candle.exe)");
var candleCommand = $"{HelperFile.WixCandlePath} -nologo -out \"{objFile}\" \"{wxsFile}\"";
_ = Exe.RunHostedCommand(candleCommand);
progress(45);
// Light links and binds one or more .wixobj files and creates a Windows Installer database (.msi or .msm).
Log.Info("Linking WiX Template (light.exe)");
var lightCommand = $"{HelperFile.WixLightPath} -spdb -sval -out \"{msiFilePath}\" \"{objFile}\"";
_ = Exe.RunHostedCommand(lightCommand);
progress(90);
} finally {
IoUtil.DeleteFileOrDirectoryHard(wxsFile, throwOnFailure: false);
IoUtil.DeleteFileOrDirectoryHard(objFile, throwOnFailure: false);
}
progress(100);
}
protected override string[] GetMainExeSearchPaths(string packDirectory, string mainExeName) protected override string[] GetMainExeSearchPaths(string packDirectory, string mainExeName)
{ {
return [ return [

View File

@@ -39,7 +39,6 @@ public class WindowsPackOptions : WindowsReleasifyOptions, INugetPackCommand, IP
public string MsiLogo { get; set; } public string MsiLogo { get; set; }
public bool BuildMsi { get; set; } public bool BuildMsi { get; set; }
public bool BuildMsiDeploymentTool { get; set; }
public string MsiVersionOverride { get; set; } public string MsiVersionOverride { get; set; }
} }

View File

@@ -67,14 +67,6 @@ public static class HelperFile
public static string StubExecutablePath => FindHelperFile("stub.exe"); public static string StubExecutablePath => FindHelperFile("stub.exe");
[SupportedOSPlatform("windows")]
public static string WixTemplatePath => FindHelperFile("wix\\template.wxs");
[SupportedOSPlatform("windows")]
public static string WixCandlePath => FindHelperFile("wix\\candle.exe");
[SupportedOSPlatform("windows")]
public static string WixLightPath => FindHelperFile("wix\\light.exe");
[SupportedOSPlatform("windows")] [SupportedOSPlatform("windows")]
public static string WixPath => FindHelperFile($"wix\\{WixVersion}\\wix.exe"); public static string WixPath => FindHelperFile($"wix\\{WixVersion}\\wix.exe");

View File

@@ -38,7 +38,6 @@ public class WindowsPackCommand : PackCommand
public bool BuildMsi { get; private set; } public bool BuildMsi { get; private set; }
public bool BuildMsiDeploymentTool { get; private set; }
public string MsiVersionOverride { get; private set; } public string MsiVersionOverride { get; private set; }
@@ -92,10 +91,6 @@ public class WindowsPackCommand : PackCommand
this.AreMutuallyExclusive(signTemplate, signParams, azTrustedSign); this.AreMutuallyExclusive(signTemplate, signParams, azTrustedSign);
AddOption<bool>((v) => BuildMsiDeploymentTool = v, "--msiDeploymentTool")
.SetDescription("Compile a .msi machine-wide deployment tool.")
.SetHidden();
AddOption<bool>((v) => BuildMsi = v, "--msi") AddOption<bool>((v) => BuildMsi = v, "--msi")
.SetDescription("Compile a .msi machine-wide bootstrap package."); .SetDescription("Compile a .msi machine-wide bootstrap package.");

View File

@@ -13,12 +13,7 @@
<PackageReference Include="Octokit" Version="14.0.0" /> <PackageReference Include="Octokit" Version="14.0.0" />
<PackageReference Include="NuGet.Packaging" Version="6.13.2" /> <PackageReference Include="NuGet.Packaging" Version="6.13.2" />
<PackageReference Include="System.Formats.Asn1" Version="9.0.3" /> <PackageReference Include="System.Formats.Asn1" Version="9.0.3" />
</ItemGroup> <PackageReference Include="WixToolset.Dtf.WindowsInstaller" Version="5.0.2" />
<ItemGroup>
<Reference Include="Microsoft.Deployment.WindowsInstaller">
<HintPath>..\..\vendor\wix\Microsoft.Deployment.WindowsInstaller.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -2,7 +2,6 @@
using System.Globalization; using System.Globalization;
using System.Runtime.Versioning; using System.Runtime.Versioning;
using System.Xml.Linq; using System.Xml.Linq;
using Microsoft.Deployment.WindowsInstaller;
using Microsoft.Win32; using Microsoft.Win32;
using NuGet.Packaging; using NuGet.Packaging;
using Velopack.Compression; using Velopack.Compression;
@@ -13,6 +12,7 @@ using Velopack.Util;
using Velopack.Vpk; using Velopack.Vpk;
using Velopack.Vpk.Logging; using Velopack.Vpk.Logging;
using Velopack.Windows; using Velopack.Windows;
using WixToolset.Dtf.WindowsInstaller;
namespace Velopack.Packaging.Tests; namespace Velopack.Packaging.Tests;
@@ -645,7 +645,7 @@ public class WindowsPackTests
var runner = GetPackRunner(logger); var runner = GetPackRunner(logger);
await runner.Run(options); await runner.Run(options);
string msiPath = Path.Combine(tmpReleaseDir, $"{id}-win-DeploymentTool.msi"); string msiPath = Path.Combine(tmpReleaseDir, $"{id}-win.msi");
Assert.True(File.Exists(msiPath)); Assert.True(File.Exists(msiPath));
using Database db = new Database(msiPath); using Database db = new Database(msiPath);

Binary file not shown.

Binary file not shown.

BIN
vendor/wix/candle.exe vendored

Binary file not shown.

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
<copyright file="app.config" company="Outercurve Foundation">
Copyright (c) 2004, Outercurve Foundation.
This software is released under Microsoft Reciprocal License (MS-RL).
The license and further copyright text can be found in the file
LICENSE.TXT at the root directory of the distribution.
</copyright>
-->
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
<supportedRuntime version="v2.0.50727" />
</startup>
<runtime>
<loadFromRemoteSources enabled="true"/>
</runtime>
</configuration>

BIN
vendor/wix/darice.cub vendored

Binary file not shown.

BIN
vendor/wix/light.exe vendored

Binary file not shown.

View File

@@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<!--
<copyright file="app.config" company="Outercurve Foundation">
Copyright (c) 2004, Outercurve Foundation.
This software is released under Microsoft Reciprocal License (MS-RL).
The license and further copyright text can be found in the file
LICENSE.TXT at the root directory of the distribution.
</copyright>
-->
<configuration>
<startup useLegacyV2RuntimeActivationPolicy="true">
<supportedRuntime version="v4.0" />
<supportedRuntime version="v2.0.50727" />
</startup>
<runtime>
<loadFromRemoteSources enabled="true"/>
</runtime>
</configuration>

View File

@@ -1,33 +0,0 @@
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" xmlns:util="http://schemas.microsoft.com/wix/UtilExtension" xmlns:netfx="http://schemas.microsoft.com/wix/NetFxExtension">
<Product Id="*" Name="{{Title}} Deployment Tool" Language="1033" Codepage="{{Codepage}}" Version="{{Version}}" UpgradeCode="{{IdAsGuid1}}" Manufacturer="{{Author}}">
<Package Description="This package installs a deployment tool for {{Title}}. Not {{Title}} itself. {{Title}} is only installed if a user logs into the machine." InstallScope="perMachine" Comments="Comments" InstallerVersion="200" Compressed="yes" Platform="{{Platform}}"/>
<MajorUpgrade AllowSameVersionUpgrades="yes" DowngradeErrorMessage="A later version of this product is already installed. Setup will now exit."/>
<Media Id="1" Cabinet="contents.cab" EmbedCab="yes" CompressionLevel="high"/>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="{{ProgramFilesFolder}}">
<Directory Id="APPLICATIONROOTDIRECTORY" Name="{{Title}} Deployment Tool" />
</Directory>
</Directory>
<DirectoryRef Id="APPLICATIONROOTDIRECTORY">
<Component Id="{{Id}}.exe" Guid="{{IdAsGuid2}}" Win64="{{Win64YesNo}}">
<File Id="{{Id}}.exe" Name="{{Id}}DeploymentTool.exe" Source="./{{SetupName}}.exe" KeyPath="yes"/>
</Component>
</DirectoryRef>
<DirectoryRef Id="TARGETDIR">
<Component Id="RegistryEntries" Guid="{{IdAsGuid3}}" Win64="{{Win64YesNo}}">
<RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Run">
<RegistryValue Type="expandable" Name="{{Id}}Deployment" Value="&quot;[#{{Id}}.exe]&quot; --checkInstall" />
</RegistryKey>
</Component>
</DirectoryRef>
<Feature Id="MainApplication" Title="Main Application" Level="1">
<ComponentRef Id="{{Id}}.exe" />
<ComponentRef Id="RegistryEntries" />
</Feature>
</Product>
</Wix>

Binary file not shown.

Binary file not shown.

BIN
vendor/wix/wix.dll vendored

Binary file not shown.