From da905f891b6b06d71f1057a239789ef2dfb5f1a2 Mon Sep 17 00:00:00 2001 From: Travis Plunk Date: Tue, 6 Mar 2018 10:13:26 -0800 Subject: [PATCH] MSI: Make sure that file components are patchable (#6303) MSI: Make sure that file components are patchable - avoid changing names and guids of components between builds as this prevents patch generation - This required submitting the file generated by heat - add code to make sure the generated file is not out of date --- assets/Product.wxs | 33 +- assets/files.wxs | 2406 ++++++++++++++++++++++++++++++++ tools/packaging/packaging.psm1 | 76 +- 3 files changed, 2495 insertions(+), 20 deletions(-) create mode 100644 assets/files.wxs diff --git a/assets/Product.wxs b/assets/Product.wxs index 6005038cdd..e2b069c93a 100644 --- a/assets/Product.wxs +++ b/assets/Product.wxs @@ -16,6 +16,7 @@ + @@ -41,13 +42,13 @@ - + + Value=""[$(var.ProductDirectoryName)]pwsh.exe" -NoProfile -ExecutionPolicy Bypass -File "[$(var.ProductDirectoryName)]RegisterManifest.ps1"" /> + Value=""[$(var.ProductDirectoryName)]pwsh.exe" -NoProfile -ExecutionPolicy Bypass -Command "Enable-PSRemoting"" /> - + @@ -141,7 +142,7 @@ - + @@ -153,7 +154,7 @@ - + @@ -167,42 +168,42 @@ - + - + - + - + - + - + - + - + @@ -214,8 +215,8 @@ diff --git a/assets/files.wxs b/assets/files.wxs new file mode 100644 index 0000000000..aae18df13f --- /dev/null +++ b/assets/files.wxs @@ -0,0 +1,2406 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tools/packaging/packaging.psm1 b/tools/packaging/packaging.psm1 index cfc9f2d672..38df12fc56 100644 --- a/tools/packaging/packaging.psm1 +++ b/tools/packaging/packaging.psm1 @@ -2050,6 +2050,11 @@ function New-MSIPackage [ValidateScript( {Test-Path $_})] [string] $ProductWxsPath = "$PSScriptRoot\..\..\assets\Product.wxs", + # File describing the MSI file components + [ValidateNotNullOrEmpty()] + [ValidateScript( {Test-Path $_})] + [string] $FilesWxsPath = "$PSScriptRoot\..\..\assets\Files.wxs", + # Path to Assets folder containing artifacts such as icons, images [ValidateNotNullOrEmpty()] [ValidateScript( {Test-Path $_})] @@ -2100,11 +2105,13 @@ function New-MSIPackage $productVersionWithName = $ProductName + '_' + $ProductVersion $productSemanticVersionWithName = $ProductName + '-' + $ProductSemanticVersion + $productDirectoryName = 'PowerShell_6' Write-Verbose "Create MSI for Product $productSemanticVersionWithName" [Environment]::SetEnvironmentVariable("ProductSourcePath", $ProductSourcePath, "Process") # These variables are used by Product.wxs in assets directory + [Environment]::SetEnvironmentVariable("ProductDirectoryName", $productDirectoryName, "Process") [Environment]::SetEnvironmentVariable("ProductName", $ProductName, "Process") [Environment]::SetEnvironmentVariable("ProductCode", $ProductCode, "Process") [Environment]::SetEnvironmentVariable("ProductVersion", $ProductVersion, "Process") @@ -2130,7 +2137,7 @@ function New-MSIPackage $wixFragmentPath = Join-Path $env:Temp "Fragment.wxs" $wixObjProductPath = Join-Path $env:Temp "Product.wixobj" - $wixObjFragmentPath = Join-Path $env:Temp "Fragment.wixobj" + $wixObjFragmentPath = Join-Path $env:Temp "files.wixobj" # cleanup any garbage on the system Remove-Item -ErrorAction SilentlyContinue $wixFragmentPath -Force @@ -2149,11 +2156,12 @@ function New-MSIPackage Write-Error -Message "Package already exists, use -Force to overwrite, path: $msiLocationPath" -ErrorAction Stop } - log "running heat..." - Start-NativeExecution -VerboseOutputOnError { & $wixHeatExePath dir $ProductSourcePath -dr $productVersionWithName -cg $productVersionWithName -gg -sfrag -srd -scom -sreg -out $wixFragmentPath -var env.ProductSourcePath -v} + log "verifying no new files have been added or removed..." + Start-NativeExecution -VerboseOutputOnError { & $wixHeatExePath dir $ProductSourcePath -dr $productDirectoryName -cg $productDirectoryName -gg -sfrag -srd -scom -sreg -out $wixFragmentPath -var env.ProductSourcePath -v} + Test-FileWxs -FilesWxsPath $FilesWxsPath -HeatFilesWxsPath $wixFragmentPath log "running candle..." - Start-NativeExecution -VerboseOutputOnError { & $wixCandleExePath "$ProductWxsPath" "$wixFragmentPath" -out (Join-Path "$env:Temp" "\\") -ext WixUIExtension -ext WixUtilExtension -arch $ProductTargetArchitecture -v} + Start-NativeExecution -VerboseOutputOnError { & $wixCandleExePath "$ProductWxsPath" "$FilesWxsPath" -out (Join-Path "$env:Temp" "\\") -ext WixUIExtension -ext WixUtilExtension -arch $ProductTargetArchitecture -v} log "running light..." # suppress ICE61, because we allow same version upgrades @@ -2184,6 +2192,66 @@ function New-MSIPackage } } +# verify no files have been added or removed +# if so, write an error with details +function Test-FileWxs +{ + param + ( + # File describing the MSI file components from the asset folder + [ValidateNotNullOrEmpty()] + [ValidateScript( {Test-Path $_})] + [string] $FilesWxsPath = "$PSScriptRoot\..\..\assets\Files.wxs", + + # File describing the MSI file components generated by heat + [ValidateNotNullOrEmpty()] + [ValidateScript( {Test-Path $_})] + [string] $HeatFilesWxsPath + ) + + [xml] $filesAssetXml = Get-Content -Raw -Path $FilesWxsPath + [xml] $heatFilesXml = Get-Content -Raw -Path $HeatFilesWxsPath + $assetFiles = $filesAssetXml.GetElementsByTagName('File') + $heatFiles = $heatFilesXml.GetElementsByTagName('File') + $indexedHeatFiles = @() + + # Index the list of files generated by heat + foreach($file in $heatFiles) + { + $indexedHeatFiles += $file.Source + } + + # Index the files from the asset wxs + # and verify that no files have been removed. + $passed = $true + $indexedAssetFiles = @() + foreach($file in $assetFiles) + { + $name = $file.Source + if($indexedHeatFiles -inotcontains $name) + { + $passed = $false + Write-Warning "{$name} is no longer in product and should be removed from {$FilesWxsPath}" + } + $indexedAssetFiles += $name + } + + # verify that no files have been added. + foreach($file in $indexedHeatFiles) + { + if($indexedAssetFiles -inotcontains $file) + { + $passed = $false + Write-Warning "new file {$file} need to be added to {$FilesWxsPath}" + } + } + + if(!$passed) + { + throw "Current files to not match {$FilesWxsPath}" + } +} + # Builds coming out of this project can have version number as 'a.b.c' OR 'a.b.c-d-f' # This function converts the above version into major.minor[.build[.revision]] format function Get-PackageVersionAsMajorMinorBuildRevision