I'm unable to find any documentation on this - the links from the 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? It's a pain in our build server environment, can it be ignored when building entirely from source code (eg build server environment)?
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
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.
Success story sharing
So I want to keep the dependency in my *.csproj files, but ignore it. I did that by adding a conditional import on a build environment targets file (eg builder.targets)
, can you elaborate?Condition="$(BclBuildImported) != 'Ignore'"
and for <Import>:Condition="$(BclBuildImported) != 'Ignore' And Exists('$(SolutionDir)\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')"