From 2da072a141878392d924657f855258c65380116f Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Mon, 6 Mar 2023 22:07:37 -0800 Subject: [PATCH] Use `msbuild` from VS 2022 if available (#395) * Use `msbuild` from VS 2022 if available - should ease local and TeamCity builds - make `%InstallDir%` unquoted (unlike `%vswhere%`) - shorten `%Path%` slightly - nits: - use script location more; no need to change directories * React to new build issues - follow up to #396 (unsure why new FxCop and "spelling" errors didn't fail that PR) * Put `PortReserver` users into an xUnit collection --- build.cmd | 35 +++++++++++++------ eng/GetXCopyMSBuild.ps1 | 3 +- .../GlobalSuppressions.cs | 2 ++ .../Properties/Resources.resx | 4 +-- test/Microsoft.TestCommon/PortReserver.cs | 5 +++ ...DataContractJsonMediaTypeFormatterTests.cs | 4 +-- .../Formatting/XmlMediaTypeFormatterTests.cs | 4 +-- .../OwinHostIntegrationTest.cs | 1 + .../Authentication/BasicOverHttpTest.cs | 1 + .../HttpSelfHostResponseTest.cs | 1 + .../HttpSelfHostServerTest.cs | 1 + 11 files changed, 44 insertions(+), 17 deletions(-) diff --git a/build.cmd b/build.cmd index 500eb973..6b591d1d 100644 --- a/build.cmd +++ b/build.cmd @@ -1,5 +1,4 @@ @echo off -pushd %~dp0 setlocal if exist bin goto Build @@ -29,7 +28,7 @@ for /f "usebackq tokens=*" %%i in (`%vswhere% -version 16 -latest -prerelease -p -requires Microsoft.Net.Component.4.5.2.TargetingPack ^ -requires Microsoft.Net.Component.4.6.2.TargetingPack ^ -property installationPath`) do ( - set InstallDir="%%i" + set "InstallDir=%%i" ) if not DEFINED InstallDir ( @@ -38,35 +37,53 @@ if not DEFINED InstallDir ( goto BuildFail ) -REM Find or install MSBuild. Need v17.4 due to our .NET SDK choice. +REM Find a 64bit MSBuild and add it to path. Require v17.4 or later due to our .NET SDK choice. +REM Check for VS2022 first. +set InstallDir= +for /f "usebackq tokens=*" %%i in (`%vswhere% -version 17.4 -latest -prerelease -products * ^ + -requires Microsoft.Component.MSBuild ^ + -property installationPath`) do ( + set "InstallDir=%%i" +) + +if DEFINED InstallDir ( + REM Add MSBuild to the path. + set "PATH=%InstallDir%\MSBuild\Current\Bin;%PATH%" + goto FoundMSBuild +) + +REM Otherwise find or install an xcopy-able MSBuild. +echo "Could not find a VS2022 installation with the necessary components (MSBuild). Falling back..." + set "MSBuildVersion=17.4.1" set "Command=[System.Threading.Thread]::CurrentThread.CurrentCulture = ''" set "Command=%Command%; [System.Threading.Thread]::CurrentThread.CurrentUICulture = ''" set "Command=%Command%; try { & '%~dp0eng\GetXCopyMSBuild.ps1' %MSBuildVersion%; exit $LASTEXITCODE }" set "Command=%Command% catch { write-host $_; exit 1 }" -PowerShell -NoProfile -NoLogo -ExecutionPolicy Bypass -Command "%Command%" +PowerShell -NoProfile -NoLogo -ExecutionPolicy Bypass -Command "%Command%" if %ERRORLEVEL% neq 0 goto BuildFail REM Add MSBuild to the path. -set "PATH=%CD%\.msbuild\%MSBuildVersion%\tools\MSBuild\Current\Bin\;%PATH%" +set "PATH=%~dp0.msbuild\%MSBuildVersion%\tools\MSBuild\Current\Bin;%PATH%" +:FoundMSBuild REM Configure NuGet operations to work w/in this repo i.e. do not pollute system packages folder. REM Note this causes two copies of packages restored using packages.config to land in this folder e.g. REM StyleCpy.5.0.0/ and stylecop/5.0.0/. -set "NUGET_PACKAGES=%CD%\packages" +set "NUGET_PACKAGES=%~dp0packages" REM Are we running in a local dev environment (not on CI)? if DEFINED CI (set Desktop=false) else if DEFINED TEAMCITY_VERSION (set Desktop=false) else (set Desktop=true) if "%1" == "" goto BuildDefaults -MSBuild Runtime.msbuild /m /nr:false /p:Platform="Any CPU" /p:Desktop=%Desktop% /v:M ^ +MSBuild "%~dp0Runtime.msbuild" /m /nr:false /p:Platform="Any CPU" /p:Desktop=%Desktop% /v:M ^ /fl /fileLoggerParameters:LogFile=bin\msbuild.log;Verbosity=Normal /consoleLoggerParameters:Summary /t:%* if %ERRORLEVEL% neq 0 goto BuildFail goto BuildSuccess :BuildDefaults -MSBuild Runtime.msbuild /m /nr:false /p:Platform="Any CPU" /p:Desktop=%Desktop% /v:M ^ +MSBuild "%~dp0Runtime.msbuild" /m /nr:false /p:Platform="Any CPU" /p:Desktop=%Desktop% /v:M ^ /fl /fileLoggerParameters:LogFile=bin\msbuild.log;Verbosity=Normal /consoleLoggerParameters:Summary if %ERRORLEVEL% neq 0 goto BuildFail goto BuildSuccess @@ -74,13 +91,11 @@ goto BuildSuccess :BuildFail echo. echo *** BUILD FAILED *** -popd endlocal exit /B 999 :BuildSuccess echo. echo **** BUILD SUCCESSFUL *** -popd endlocal exit /B 0 diff --git a/eng/GetXCopyMSBuild.ps1 b/eng/GetXCopyMSBuild.ps1 index 6ab853c3..66783928 100644 --- a/eng/GetXCopyMSBuild.ps1 +++ b/eng/GetXCopyMSBuild.ps1 @@ -39,4 +39,5 @@ function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install, [string return Join-Path $packageDir 'tools' } -InitializeXCopyMSBuild -packageVersion $Version -install $true -ToolsDir (join-path $PWD .msbuild) +$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot '..\') +InitializeXCopyMSBuild -packageVersion $Version -install $true -ToolsDir (join-path $RepoRoot .msbuild) diff --git a/src/System.Net.Http.Formatting/GlobalSuppressions.cs b/src/System.Net.Http.Formatting/GlobalSuppressions.cs index deefc565..d815e56e 100644 --- a/src/System.Net.Http.Formatting/GlobalSuppressions.cs +++ b/src/System.Net.Http.Formatting/GlobalSuppressions.cs @@ -6,3 +6,5 @@ using System.Diagnostics.CodeAnalysis; [assembly: SuppressMessage("Microsoft.Design", "CA2210:AssembliesShouldHaveValidStrongNames")] [assembly: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "System.Net.Http.Headers", Justification = "We follow the layout of System.Net.Http.")] [assembly: SuppressMessage("Microsoft.Design", "CA1020:AvoidNamespacesWithFewTypes", Scope = "namespace", Target = "System.Net.Http.Handlers", Justification = "Handlers provide an extensibility hook which we want to keep in a separate namespace.")] +// Some resources are specific to the netstandard1.3 assembly +[assembly: SuppressMessage("Microsoft.Web.FxCop", "MW1000:UnusedResourceUsageRule", Justification = "There are a few unused resources due to missing netstandard1.3 features.")] diff --git a/src/System.Net.Http.Formatting/Properties/Resources.resx b/src/System.Net.Http.Formatting/Properties/Resources.resx index ef5c4a7d..82d90e68 100644 --- a/src/System.Net.Http.Formatting/Properties/Resources.resx +++ b/src/System.Net.Http.Formatting/Properties/Resources.resx @@ -358,9 +358,9 @@ Cannot access a closed stream. - Unable to validate types on this platform when {0} is 'true'. Please reset {0} or move to a supported platform, one where the 'netstandard2.0' assembly is usable. + Unable to validate types on this platform when {0} is 'true'. Please reset {0} or move to a supported platform, one where the .NET Standard 2.0 assembly is usable. - Unable to validate types on this platform when {0} is 'false'. Please set {0} or move to a supported platform, one where the 'netstandard2.0' assembly is usable. + Unable to validate types on this platform when {0} is 'false'. Please set {0} or move to a supported platform, one where the .NET Standard 2.0 assembly is usable. \ No newline at end of file diff --git a/test/Microsoft.TestCommon/PortReserver.cs b/test/Microsoft.TestCommon/PortReserver.cs index f085399a..bfa95d61 100644 --- a/test/Microsoft.TestCommon/PortReserver.cs +++ b/test/Microsoft.TestCommon/PortReserver.cs @@ -12,6 +12,11 @@ using System.Threading; namespace Microsoft.TestCommon { + [Xunit.CollectionDefinition("PortReserver Collection", DisableParallelization = true)] + public class PortReserverCollection + { + } + /// /// This class allocates ports while ensuring that: /// 1. Ports that are permanently taken (or taken for the duration of the test) are not being attempted to be used. diff --git a/test/System.Net.Http.Formatting.Test/Formatting/DataContractJsonMediaTypeFormatterTests.cs b/test/System.Net.Http.Formatting.Test/Formatting/DataContractJsonMediaTypeFormatterTests.cs index 7ad93ee2..b94b1959 100644 --- a/test/System.Net.Http.Formatting.Test/Formatting/DataContractJsonMediaTypeFormatterTests.cs +++ b/test/System.Net.Http.Formatting.Test/Formatting/DataContractJsonMediaTypeFormatterTests.cs @@ -193,7 +193,7 @@ namespace System.Net.Http.Formatting formatter.ReadFromStreamAsync(variationType, stream, content, formatterLogger: null), "Unable to validate types on this platform when UseDataContractJsonSerializer is 'true'. " + "Please reset UseDataContractJsonSerializer or move to a supported platform, one where the " + - "'netstandard2.0' assembly is usable."); + ".NET Standard 2.0 assembly is usable."); } } @@ -211,7 +211,7 @@ namespace System.Net.Http.Formatting formatter.WriteToStreamAsync(variationType, testData, stream, content, transportContext: null), "Unable to validate types on this platform when UseDataContractJsonSerializer is 'true'. " + "Please reset UseDataContractJsonSerializer or move to a supported platform, one where the " + - "'netstandard2.0' assembly is usable."); + ".NET Standard 2.0 assembly is usable."); } #else diff --git a/test/System.Net.Http.Formatting.Test/Formatting/XmlMediaTypeFormatterTests.cs b/test/System.Net.Http.Formatting.Test/Formatting/XmlMediaTypeFormatterTests.cs index c83f687e..8dd69fe1 100644 --- a/test/System.Net.Http.Formatting.Test/Formatting/XmlMediaTypeFormatterTests.cs +++ b/test/System.Net.Http.Formatting.Test/Formatting/XmlMediaTypeFormatterTests.cs @@ -516,7 +516,7 @@ namespace System.Net.Http.Formatting await Assert.ThrowsAsync(() => formatter.ReadFromStreamAsync(variationType, stream, content, formatterLogger: null), "Unable to validate types on this platform when UseXmlSerializer is 'false'. Please set " + - "UseXmlSerializer or move to a supported platform, one where the 'netstandard2.0' assembly " + + "UseXmlSerializer or move to a supported platform, one where the .NET Standard 2.0 assembly " + "is usable."); } } @@ -534,7 +534,7 @@ namespace System.Net.Http.Formatting await Assert.ThrowsAsync(() => formatter.WriteToStreamAsync(variationType, testData, stream, content, transportContext: null), "Unable to validate types on this platform when UseXmlSerializer is 'false'. Please set " + - "UseXmlSerializer or move to a supported platform, one where the 'netstandard2.0' assembly " + + "UseXmlSerializer or move to a supported platform, one where the .NET Standard 2.0 assembly " + "is usable."); } diff --git a/test/System.Web.Http.Owin.Test/OwinHostIntegrationTest.cs b/test/System.Web.Http.Owin.Test/OwinHostIntegrationTest.cs index 17e2d15d..1300d1fd 100644 --- a/test/System.Web.Http.Owin.Test/OwinHostIntegrationTest.cs +++ b/test/System.Web.Http.Owin.Test/OwinHostIntegrationTest.cs @@ -12,6 +12,7 @@ using Owin; namespace System.Web.Http.Owin { + [Xunit.Collection("PortReserver Collection")] // Avoid conflicts between different PortReserver consumers. public class OwinHostIntegrationTest { [Fact] diff --git a/test/System.Web.Http.SelfHost.Test/Authentication/BasicOverHttpTest.cs b/test/System.Web.Http.SelfHost.Test/Authentication/BasicOverHttpTest.cs index 0b2a5739..85cde946 100644 --- a/test/System.Web.Http.SelfHost.Test/Authentication/BasicOverHttpTest.cs +++ b/test/System.Web.Http.SelfHost.Test/Authentication/BasicOverHttpTest.cs @@ -10,6 +10,7 @@ using Microsoft.TestCommon; namespace System.Web.Http { + [Xunit.Collection("PortReserver Collection")] // Avoid conflicts between different PortReserver consumers. public class BasicOverHttpTest { [Fact] diff --git a/test/System.Web.Http.SelfHost.Test/HttpSelfHostResponseTest.cs b/test/System.Web.Http.SelfHost.Test/HttpSelfHostResponseTest.cs index bb192b92..8a891905 100644 --- a/test/System.Web.Http.SelfHost.Test/HttpSelfHostResponseTest.cs +++ b/test/System.Web.Http.SelfHost.Test/HttpSelfHostResponseTest.cs @@ -12,6 +12,7 @@ using Microsoft.TestCommon; namespace System.Web.Http.SelfHost { + [Xunit.Collection("PortReserver Collection")] // Avoid conflicts between different PortReserver consumers. public class HttpSelfHostResponseTest { [Fact] diff --git a/test/System.Web.Http.SelfHost.Test/HttpSelfHostServerTest.cs b/test/System.Web.Http.SelfHost.Test/HttpSelfHostServerTest.cs index afd3b77c..a53f4ba3 100644 --- a/test/System.Web.Http.SelfHost.Test/HttpSelfHostServerTest.cs +++ b/test/System.Web.Http.SelfHost.Test/HttpSelfHostServerTest.cs @@ -18,6 +18,7 @@ using Microsoft.TestCommon; namespace System.Web.Http.SelfHost { + [Xunit.Collection("PortReserver Collection")] // Avoid conflicts between different PortReserver consumers. public class HttpSelfHostServerTest : IDisposable { private HttpSelfHostServer server = null;