From b025102b17519474d1921d0c44aac62d15024df9 Mon Sep 17 00:00:00 2001 From: Xavier Decoster Date: Thu, 22 Aug 2019 19:34:42 +0200 Subject: [PATCH] Ensure build script works on VS2019-only machine --- build/common.ps1 | 81 ++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/build/common.ps1 b/build/common.ps1 index 43ea244f..e4791594 100644 --- a/build/common.ps1 +++ b/build/common.ps1 @@ -7,10 +7,11 @@ $PrivateRoot = Join-Path $PSScriptRoot "private" $DotNetExe = Join-Path $CLIRoot 'dotnet.exe' $NuGetExe = Join-Path $NuGetClientRoot '.nuget\nuget.exe' $7zipExe = Join-Path $NuGetClientRoot 'tools\7zip\7za.exe' +$BuiltInVsWhereExe = "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" $Artifacts = Join-Path $NuGetClientRoot artifacts $MSBuildRoot = Join-Path ${env:ProgramFiles(x86)} 'MSBuild\' $MSBuildExeRelPath = 'bin\msbuild.exe' -$VisualStudioVersion = 14.0 +$VisualStudioVersion = 15.0 $NuGetBuildPackageId = 'NuGet.Services.Build' $NuGetBuildPackageVersion = '1.0.0' @@ -77,49 +78,55 @@ Function Clear-Artifacts { } } +Function Get-LatestVisualStudioRoot { + + if (Test-Path $BuiltInVsWhereExe) { + $installationPath = & $BuiltInVsWhereExe -latest -prerelease -property installationPath + $installationVersion = & $BuiltInVsWhereExe -latest -prerelease -property installationVersion + Verbose-Log "Found Visual Studio at '$installationPath' version '$installationVersion' with '$BuiltInVsWhereExe'" + # Set the fallback version + $majorVersion = "$installationVersion".Split('.')[0] + $script:FallbackVSVersion = "$majorVersion.0" + + return $installationPath + } + + Error-Log "Could not find a compatible Visual Studio Version because $BuiltInVsWhereExe does not exist" -Fatal +} + Function Get-MSBuildExe { param( - [int]$MSBuildVersion + [ValidateSet("15", "16", $null)] + [string]$MSBuildVersion ) - - $MSBuildPath = $null - if ($MSBuildVersion -lt 15) { - $MSBuildExe = Join-Path $MSBuildRoot ([string]$MSBuildVersion + ".0") - $MSBuildPath = Join-Path $MSBuildExe $MSBuildExeRelPath + if(-not $MSBuildVersion){ + $MSBuildVersion = Get-VSMajorVersion + } + + $CommonToolsVar = "Env:VS${MSBuildVersion}0COMNTOOLS" + if (Test-Path $CommonToolsVar) { + $CommonToolsValue = gci $CommonToolsVar | select -expand value -ea Ignore + $MSBuildRoot = Join-Path $CommonToolsValue '..\..\MSBuild' -Resolve } else { - # Check if VS package to use to find $NuGetBuildPackageId is installed. If not, install it. - $buildPackageFound = [System.AppDomain]::CurrentDomain.GetAssemblies() | ` - Where-Object { $_.FullName -like "$($NuGetBuildPackageId), *" } - if (-not $buildPackageFound) - { - Trace-Log "Installing and configuring $NuGetBuildPackageId" - $opts = "install", $NuGetBuildPackageId, ` - "-Version", $NuGetBuildPackageVersion, ` - "-Source", "https://api.nuget.org/v3/index.json;https://dotnet.myget.org/F/nuget-build/api/v3/index.json", ` - "-OutputDirectory", "$PSScriptRoot\packages" - & $NuGetExe $opts | Out-Null - if (-not $?) { - Error-Log "Failed to install package $NuGetBuildPackageId $NuGetBuildPackageVersion!" - } else { - Add-Type -Path "$PSScriptRoot\packages\$NuGetBuildPackageId.$NuGetBuildPackageVersion\lib\net452\$NuGetBuildPackageId.dll" | Out-Null - } - } - - $installations = @([NuGet.Services.Build.VisualStudioSetupConfigurationHelper]::GetInstancePaths() | ForEach-Object { - $MSBuildRoot = Join-Path "$_\MSBuild" ([string]$MSBuildVersion + ".0") - Join-Path $MSBuildRoot $MSBuildExeRelPath - } | Where-Object { Test-Path $_ }) - - if ($installations.Count -ge 1) { - $MSBuildPath = $installations[0] - } else { - Error-Log "Failed to find MSBuild $MSBuildVersion!" + $VisualStudioRoot = Get-LatestVisualStudioRoot + if ($VisualStudioRoot -and (Test-Path $VisualStudioRoot)) { + $MSBuildRoot = Join-Path $VisualStudioRoot 'MSBuild' } } - - Trace-Log "MSBuild found at $MSBuildPath" - $MSBuildPath + + $MSBuildExe = Join-Path $MSBuildRoot 'Current\bin\msbuild.exe' + + if (-not (Test-Path $MSBuildExe)) { + $MSBuildExe = Join-Path $MSBuildRoot "${MSBuildVersion}.0\bin\msbuild.exe" + } + + if (Test-Path $MSBuildExe) { + Verbose-Log "Found MSBuild.exe at `"$MSBuildExe`"" + $MSBuildExe + } else { + Error-Log 'Could not find MSBuild.exe' -Fatal + } } Function Invoke-BuildStep {