MSBuild 16.9.0
MSBuild 16.9.0
This version of MSBuild shipped with Visual Studio 2019 version 16.9.0 and .NET SDK 5.0.200.
What's new
MSB3277
warnings now include information about the assembly identities involved, instead of saying to rerun under higher verbosity.- It's now possible to opt out of culture-name detection of
EmbeddedResource
s, for instance to have a resource nameda.cs.template
. - Common targets now support
$(BaseOutputPath)
, with the default valuebin
. - Item
Update
s are no longer case-sensitive, fixing a regression in MSBuild 16.6 (#5888). ParentBuildEventContext
now includes a parentMSBuild
task if relevant, enabling proper nesting in GUI viewers.- Builds that fail because a warning was elevated to an error now report overall failure in the
MSBuild.exe
exit code.
Detailed release notes
Added
- The
MSB4006
error has been enhanced to describe the cycle when possible (#5711). Thanks, @haiyuzhu!. - More information is logged under
MSBUILDDEBUGCOMM
(#5759). - The command line parser now accepts arguments with double hyphens (
--argument
) as well as single hyphens (-argument
) and forward slashes (/argument
) (#5786). Thanks, @BartoszKlonowski! - MSBuild now participates in the .NET CLI text performance log system on an opt-in basis (#5861).
- Common targets now support
$(BaseOutputPath)
, with the default valuebin
(#5238). Thanks, @Nirmal4G! Microsoft.Build.Exceptions.CircularDependencyException
is now public (#5988). Thanks, @tflynt91!EvaluationId
is now preserved in theProjectStarted
event, allowing disambiguating related project start events (#5997). Thanks, @KirillOsenkov!- The
ResolveAssemblyReference
task can now optionally emit items describing unresolved assembly conflicts (#5990). - Experimental
ProjectCache
API to enable higher-order build systems (#5936).
Changed
- Warnings suppressed via
$(NoWarn)
(which formerly applied only to targets that opted in like the C# compiler) are now treated as$(MSBuildWarningsAsMessages)
(#5671). - Warnings elevated via
$(WarningsAsErrors )
(which formerly applied only to targets that opted in like the C# compiler) are now treated as$(MSBuildWarningsAsErrors)
(#5774). - Improved error message when using an old .NET (Core) SDK and targeting .NET 5.0 (#5826).
- Trailing spaces in property expressions inside conditionals now emit an error instead of silently expanding to the empty string (#5672, #5868). Thanks, @mfkl!
MSB3277
warnings now include information about the assembly identities involved, instead of saying to rerun under higher verbosity (#5798).MSB5009
errors now indicate the project in the solution that is causing the nesting error (#5835). Thanks, @BartoszKlonowski!- Avoid spawning a process to determine processor architecture (#5897). Thanks, @tmds!
- It's now possible to opt out of culture-name detection of
EmbeddedResource
s, for instance to have a resource nameda.cs.template
(#5824). ProjectInSolution.AbsolutePath
returns a normalized full path when possible (#5949).- Evaluation pass-stop events now include information about the "size" (number of properties/items/imports) of the project (#5978). Thanks, @arkalyanms!
Fixed
AllowFailureWithoutError
now does what it said it would do (#5743).- The solution parser now no longer skips projects that are missing an EndProject line (#5808). Thanks, @BartoszKlonowski!
ProjectReference
s to.vcxproj
projects from multi-targeted .NET projects no longer overbuild (#5838).- Removed unused
InternalsVisibleTo
to obsolete test assemblies (#5914). Thanks, @SingleAccretion! - Respect conditions when removing all items from an existing list at evaluation time (#5927).
- Common targets should no longer break if the environment variable
OS
is set (#5916). - Some internal errors will now be reported as errors instead of hanging the build (#5917).
- Item
Update
s are no longer case-sensitive, fixing a regression in MSBuild 16.6 (#5888). - Use lazy string formatting in more places (#5924).
- Redundant references to MSBuild assemblies no longer fail in 64 MSBuild inline tasks (#5975).
- The
Exec
task will now no longer emit the expandedCommand
to the log on failure (#5962). Thanks, @tmds! - Tasks generated with
RoslynCodeTaskFactory
now no longer rebuild for every use, even with identical inputs (#5988). Thanks, @KirillOsenkov! ParentBuildEventContext
now includes a parentMSBuild
task if relevant (#5966). Thanks, @KirillOsenkov!- Builds that fail because a warning was elevated to an error now report overall failure in the
MSBuild.exe
exit code (#6006). - Performance of projects with large numbers of consecutive item updates without wildcards improved (#5853).
- Performance improvements in
ResolveAssemblyReferences
(#5973). - PackageReferences that are marked as development dependencies are removed from the ClickOnce manifest (#6037).
- Stop overfiltering .NET Core assemblies from the ClickOnce manifest (#6080).
Infrastructure
- The MSBuild codebase now warns for unused
using
statements (#5761). - The MSBuild codebase is now indexed for Rich Code Navigation on CI build (#5790). Thanks, @jepetty!
- The 64-bit bootstrap directory is more usable (#5825).
- Test robustness improvements (#5827, #5944, #5995).
- Make non-shipping NuGet packages compliant (#5823).
- Use Darc to keep bootstrap dependencies up to date (#5909).
- Replace MSBuild.Dev.sln and MSBuild.SourceBuild.sln with solution filters (#6010).
- Minimize and update NuGet feeds (#6019, #6136).