¿Qué hace el paquete Microsoft.Bcl.Build NuGet?

82

No puedo encontrar ninguna documentación sobre esto; los enlaces de la página Microsoft.Bcl.Build Nuget no brindan mucha ayuda:

Este paquete proporciona componentes de infraestructura de compilación para que los proyectos que hacen referencia a paquetes específicos de Microsoft puedan compilarse correctamente.

No haga referencia directamente a estos paquetes a menos que reciba una advertencia de compilación que le indique que agregue una referencia.

Al mirar el Microsoft.Bcl.Build.targetsarchivo, parece que administra redirecciones de enlace y referencias de paquetes. Parece que parte de esta funcionalidad se usa solo cuando se ejecuta en Visual Studio.

¿Alguien puede proporcionar más información sobre lo que hace este paquete? Es un problema en nuestro entorno de servidor de compilación , ¿se puede ignorar cuando se compila completamente desde el código fuente (por ejemplo, el entorno de servidor de compilación)?

crimbo
fuente

Respuestas:

26

Mirando Microsoft.Bcl.Build.targets, tiene un montón de objetivos de configuración del proyecto, por ejemplo:

  • EnsureBindingRedirects - Determine qué referencias están habilitadas para las redirecciones vinculantes y actualice la app.config con ellas
  • BclBuildValidateNugetPackageReferences - Este objetivo valida que cualquier paquete de Nuget instalado en el proyecto actual también tenga sus dependencias (dependencias transitivas) instaladas en el proyecto actual.

Entonces, en base a esta evaluación, decidí que esta funcionalidad solo es necesaria en un entorno de desarrollo, al agregar / eliminar / actualizar dependencias de NuGet; y que podría ignorarse en un entorno de CI, donde está causando problemas.

Así que quiero mantener la dependencia en mis archivos * .csproj, pero ignórela cuando ejecute una compilación de CI. Lo hice agregando una importación condicional en un archivo de objetivos del entorno de compilación (por ejemplo, builder.targets), que incluye este bloque:

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

Esto tiene el efecto neto de ignorar los objetivos en un entorno de CI, pero activarlos en un entorno de desarrollo. He tenido esto funcionando durante más de una semana, y hasta ahora no tengo problemas ...

Todavía me encantaría saber si alguien tiene mejor información sobre este paquete que indique que hacer esto es una mala idea. Hasta ahora soy de la opinión de que es una buena idea.

Editar 2018-02-01:

Tenga en cuenta que el parámetro ignorar también se puede pasar en la línea de comandos, para omitir la Microsoft.Bcl.Build.targetslógica:

msbuild (targets, etc) /p:BclBuildImported=Ignore
crimbo
fuente
No entendí del todo 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), ¿puede darnos más detalles?
JobaDiniz
Necesitaba mantener la referencia del proyecto a Microsoft.Bcl.Build para que se pueda usar durante el desarrollo / dentro de Visual Studio. La lógica se ejecuta durante las actualizaciones de dependencia. Pero quería deshabilitarlo durante las compilaciones del servidor de compilación debido a problemas al ejecutarlo en un servidor de compilación.
crimbo
1
Para ser más claro acerca de cómo verificar esto, aquí hay un ejemplo de lo que agregué a los elementos <Target> e <Import>: Para <Target>: Condition="$(BclBuildImported) != 'Ignore'"y para <Import>:Condition="$(BclBuildImported) != 'Ignore' And Exists('$(SolutionDir)\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')"
Auri Rahimzadeh
También encontré que esto es una tontería que quedó de mi código heredado que requería .nuget \ something.targets
Auri Rahimzadeh