ChatGPT解决这个技术问题 Extra ChatGPT

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

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)?


c
crimbo

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

I did not quite understand 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?
I needed to keep the project reference to Microsoft.Bcl.Build so it can be used during development/within Visual Studio. The logic runs during dependency updates. But I wanted to disable it during build server builds due to problems running it on a build server.
To be more clear about how to check for this, here's an example of what I added to the <Target> and <Import> items: For <Target>: Condition="$(BclBuildImported) != 'Ignore'" and for <Import>: Condition="$(BclBuildImported) != 'Ignore' And Exists('$(SolutionDir)\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')"
I also found this being a silly thing left over from my legacy code that required .nuget\something.targets
X
Xavier Poinas

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.