mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 03:37:59 +01:00
Remove WiX v3 infrastructure and migrate exclusively to WiX v5 (#41975)
## Summary: This pull request refactors the installer build pipeline to simplify and modernize the process, focusing exclusively on the WiX 5 (VNext) installer and removing legacy WiX 3 support. It eliminates the use of the `installerSuffix` parameter and related logic, removes the legacy installer build steps and scripts, and updates documentation to reflect the new architecture. The changes streamline the pipeline, reduce complexity, and ensure only the latest installer is built and signed. Pipeline and build system simplification: * Removed the `installerSuffix` parameter and all related logic from pipeline templates and YAML files, including file naming, build steps, and hash calculation scripts. * Removed legacy WiX 3 installer build steps and the associated script `installWiX.ps1`, focusing exclusively on WiX 5 (VNext) installer builds. Installer signing and build process updates: * Updated `.pipelines/ESRPSigning_installer.json` to remove signing configuration for the legacy `PowerToysSetupCustomActions.dll`, ensuring only the VNext DLL is signed. Documentation updates: * Updated `doc/devdocs/core/installer.md` to remove references to WiX 3, clarify the installer architecture as WiX 5 only, and describe the new build process. ## CheckList: - [ ] Should Build successfully and produce installer for both per user and per machine - [ ] Should install without problem --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: vanzue <69313318+vanzue@users.noreply.github.com> Co-authored-by: Kai Tao (from Dev Box) <kaitao@microsoft.com>
This commit is contained in:
@@ -21,12 +21,9 @@ Specifies the build configuration (e.g., 'Debug', 'Release'). Default is 'Releas
|
||||
.PARAMETER PerUser
|
||||
Specifies whether to build a per-user installer (true) or machine-wide installer (false). Default is true (per-user).
|
||||
|
||||
.PARAMETER InstallerSuffix
|
||||
Specifies the suffix for the installer naming (e.g., 'wix5', 'vnext'). Default is 'wix5'.
|
||||
|
||||
.EXAMPLE
|
||||
.\build-installer.ps1
|
||||
Runs the installer build pipeline for x64 Release with default suffix (wix5).
|
||||
Runs the installer build pipeline for x64 Release.
|
||||
|
||||
.EXAMPLE
|
||||
.\build-installer.ps1 -Platform x64 -Configuration Release
|
||||
@@ -36,10 +33,6 @@ Runs the pipeline for x64 Release.
|
||||
.\build-installer.ps1 -Platform x64 -Configuration Release -PerUser false
|
||||
Runs the pipeline for x64 Release with machine-wide installer.
|
||||
|
||||
.EXAMPLE
|
||||
.\build-installer.ps1 -Platform x64 -Configuration Release -InstallerSuffix vnext
|
||||
Runs the pipeline for x64 Release with 'vnext' suffix.
|
||||
|
||||
.NOTES
|
||||
- Make sure to run this script from a Developer PowerShell (e.g., VS2022 Developer PowerShell).
|
||||
- Generated MSIX files will be signed using cert-sign-package.ps1.
|
||||
@@ -54,8 +47,7 @@ Runs the pipeline for x64 Release with 'vnext' suffix.
|
||||
param (
|
||||
[string]$Platform = '',
|
||||
[string]$Configuration = 'Release',
|
||||
[string]$PerUser = 'true',
|
||||
[string]$InstallerSuffix = 'wix5'
|
||||
[string]$PerUser = 'true'
|
||||
)
|
||||
|
||||
# Ensure helpers are available
|
||||
@@ -97,7 +89,7 @@ if (-not $repoRoot -or -not (Test-Path (Join-Path $repoRoot "PowerToys.sln"))) {
|
||||
}
|
||||
|
||||
Write-Host "PowerToys repository root detected: $repoRoot"
|
||||
# WiX v5 projects use WixToolset.Sdk via NuGet/MSBuild; a separate WiX 3 installation is not required here.
|
||||
# WiX v5 projects use WixToolset.Sdk via NuGet/MSBuild; no separate WiX installation is required.
|
||||
Write-Host ("[PIPELINE] Start | Platform={0} Configuration={1} PerUser={2}" -f $Platform, $Configuration, $PerUser)
|
||||
Write-Host ''
|
||||
|
||||
@@ -151,8 +143,8 @@ try {
|
||||
|
||||
RunMSBuild 'installer\PowerToysSetup.sln' "$commonArgs /t:restore /p:RestorePackagesConfig=true" $Platform $Configuration
|
||||
|
||||
RunMSBuild 'installer\PowerToysSetup.sln' "$commonArgs /m /t:PowerToysInstallerVNext /p:PerUser=$PerUser /p:InstallerSuffix=$InstallerSuffix" $Platform $Configuration
|
||||
RunMSBuild 'installer\PowerToysSetup.sln' "$commonArgs /m /t:PowerToysInstallerVNext /p:PerUser=$PerUser" $Platform $Configuration
|
||||
|
||||
RunMSBuild 'installer\PowerToysSetup.sln' "$commonArgs /m /t:PowerToysBootstrapperVNext /p:PerUser=$PerUser /p:InstallerSuffix=$InstallerSuffix" $Platform $Configuration
|
||||
RunMSBuild 'installer\PowerToysSetup.sln' "$commonArgs /m /t:PowerToysBootstrapperVNext /p:PerUser=$PerUser" $Platform $Configuration
|
||||
|
||||
Write-Host '[PIPELINE] Completed'
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Ensure WiX Toolset 3.14 (build 3141) is installed and ready to use.
|
||||
|
||||
.DESCRIPTION
|
||||
- Skips installation if the toolset is already installed (unless -Force is used).
|
||||
- Otherwise downloads the official installer and binaries, verifies SHA-256, installs silently,
|
||||
and copies wix.targets into the installation directory.
|
||||
.PARAMETER Force
|
||||
Forces reinstallation even if the toolset is already detected.
|
||||
.PARAMETER InstallDir
|
||||
The target installation path. Default is 'C:\Program Files (x86)\WiX Toolset v3.14'.
|
||||
.EXAMPLE
|
||||
.\EnsureWix.ps1 # Ensure WiX is installed
|
||||
.\EnsureWix.ps1 -Force # Force reinstall
|
||||
#>
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[switch]$Force,
|
||||
[string]$InstallDir = 'C:\Program Files (x86)\WiX Toolset v3.14'
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$ProgressPreference = 'SilentlyContinue'
|
||||
|
||||
# Download URLs and expected SHA-256 hashes
|
||||
$WixDownloadUrl = 'https://github.com/wixtoolset/wix3/releases/download/wix3141rtm/wix314.exe'
|
||||
$WixBinariesDownloadUrl = 'https://github.com/wixtoolset/wix3/releases/download/wix3141rtm/wix314-binaries.zip'
|
||||
$InstallerHashExpected = '6BF6D03D6923D9EF827AE1D943B90B42B8EBB1B0F68EF6D55F868FA34C738A29'
|
||||
$BinariesHashExpected = '6AC824E1642D6F7277D0ED7EA09411A508F6116BA6FAE0AA5F2C7DAA2FF43D31'
|
||||
|
||||
# Check if WiX is already installed
|
||||
$candlePath = Join-Path $InstallDir 'bin\candle.exe'
|
||||
if (-not $Force -and (Test-Path $candlePath)) {
|
||||
Write-Host "WiX Toolset is already installed at `"$InstallDir`". Skipping installation."
|
||||
return
|
||||
}
|
||||
|
||||
# Temp file paths
|
||||
$tmpDir = [IO.Path]::GetTempPath()
|
||||
$installer = Join-Path $tmpDir 'wix314.exe'
|
||||
$binariesZip = Join-Path $tmpDir 'wix314-binaries.zip'
|
||||
|
||||
# Download installer and binaries
|
||||
Write-Host 'Downloading WiX installer...'
|
||||
Invoke-WebRequest -Uri $WixDownloadUrl -OutFile $installer -UseBasicParsing
|
||||
Write-Host 'Downloading WiX binaries...'
|
||||
Invoke-WebRequest -Uri $WixBinariesDownloadUrl -OutFile $binariesZip -UseBasicParsing
|
||||
|
||||
# Verify SHA-256 hashes
|
||||
Write-Host 'Verifying installer hash...'
|
||||
if ((Get-FileHash -Algorithm SHA256 $installer).Hash -ne $InstallerHashExpected) {
|
||||
throw 'wix314.exe SHA256 hash mismatch'
|
||||
}
|
||||
Write-Host 'Verifying binaries hash...'
|
||||
if ((Get-FileHash -Algorithm SHA256 $binariesZip).Hash -ne $BinariesHashExpected) {
|
||||
throw 'wix314-binaries.zip SHA256 hash mismatch'
|
||||
}
|
||||
|
||||
# Perform silent installation
|
||||
Write-Host 'Installing WiX Toolset silently...'
|
||||
Start-Process -FilePath $installer -ArgumentList '/install','/quiet' -Wait
|
||||
|
||||
# Extract binaries and copy wix.targets
|
||||
$expandDir = Join-Path $tmpDir 'wix-binaries'
|
||||
if (Test-Path $expandDir) { Remove-Item $expandDir -Recurse -Force }
|
||||
Expand-Archive -Path $binariesZip -DestinationPath $expandDir -Force
|
||||
Copy-Item -Path (Join-Path $expandDir 'wix.targets') `
|
||||
-Destination (Join-Path $InstallDir 'wix.targets') -Force
|
||||
|
||||
Write-Host "WiX Toolset has been successfully installed at: $InstallDir"
|
||||
Reference in New Issue
Block a user