What does the Microsoft.Bcl.Build NuGet package do?

.NetNuget.Net 4.5

.Net Problem Overview


I'm unable to find any documentation on this - the links from the https://www.nuget.org/packages/Microsoft.Bcl.Build/1.0.13">Microsoft.Bcl.Build Nuget page don't provide much help:

> This package provides build infrastructure components so that projects referencing specific Microsoft packages can successfully build. > > Do not directly reference this packages unless you receive a build warning that instructs you to add a reference.

From looking at the Microsoft.Bcl.Build.targets file, it looks like it manages binding redirects and package references. It looks like some of this functionality is used only when running in Visual Studio.

Can anyone provide any more information on what this package does? https://stackoverflow.com/questions/18654569/teamcity-microsoft-bcl-build-dependency">It's a pain in our build server environment, can it be ignored when building entirely from source code (eg build server environment)?

.Net Solutions


Solution 1 - .Net

From looking at Microsoft.Bcl.Build.targets, it has a bunch of project configuration targets, eg:

  • EnsureBindingRedirects - Determine which references are opted in for binding redirects, and update the app.config with them
  • BclBuildValidateNugetPackageReferences - This target validates that any Nuget packages installed in the current project also have their dependencies (transitive dependencies) installed in the current project.

So based on this evaluation, I decided that this functionality is only needed in a dev environment, when adding/removing/updating NuGet dependencies; and that it could be ignored in a CI environment, where it's causing problems.

So I want to keep the dependency in my *.csproj files, but ignore it when running a CI build. I did that by adding a conditional import on a build environment targets file (eg builder.targets), which includes this block:

<!-- Skip Microsoft.Bcl.Build functionality when building only from Source. -->
<PropertyGroup>
  <BclBuildImported>Ignore</BclBuildImported>
</PropertyGroup>

This has the net effect of ignoring the targets in a CI environment, but activating them in a development environment. I've had this running for over a week, and no problems so far...

I'd still love to know if anyone has better information on this package that indicates that doing this is a bad idea. So far I'm of the opinion that it's a good idea.

Edit 2018-02-01:

Note that the ignore parameter can also be passed on the command-line, to skip the Microsoft.Bcl.Build.targets logic:

msbuild (targets, etc) /p:BclBuildImported=Ignore

Solution 2 - .Net

It is basically a way for older packages that targeted older .Net to build and compile with no problems on new .Nets

If you go to http://blogs.msdn.com/b/bclteam/p/bclbuild.aspx you will see two announcements linking to https://devblogs.microsoft.com/dotnet/pcl-and-net-nuget-libraries-are-now-enabled-for-xamarin/ and https://devblogs.microsoft.com/dotnet/improved-package-restore/ that should explain it.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestioncrimboView Question on Stackoverflow
Solution 1 - .NetcrimboView Answer on Stackoverflow
Solution 2 - .NetMatthew VerstraeteView Answer on Stackoverflow