¿Cómo anulo la configuración CopyLocal (privada) para las referencias en .NET de MSBUILD

He estado luchando con esto durante unos días y después de un montón de búsquedas no puedo encontrar el camino en el que debería estar.

Lo que quiero hacer es configurar un proyecto MSBUILD que construya toda nuestra aplicación .NET (compuesta de 8 soluciones, y tal vez 250 proyectos divididos entre ellas) con una cantidad de configuraciones anuladas desde los archivos individuales del proyecto para crear una estructura de depuración para mí.

Específicamente, deseo construir nuestra configuración de lanzamiento con las optimizaciones desactivadas y la información de depuración completa / pdbs generadas. Además, con el fin de reducir nuestro tiempo de comstackción ultra-largo actual, quiero que “copy local” (o privado en el archivo proj real xml) sea falso para cada referencia de cada proyecto.

Lo primero fue bastante fácil, puedo anular una propiedad a nivel de proyecto bastante fácilmente (incluso puedes hacer esto desde la línea de comando de MSBuild usando / p), pero lo que no puedo entender es cómo anular una propiedad en una referencia. He intentado varias cosas que vi aquí en StackOverflow y en la web, pero todavía nada es una solución.

Puedo hacer lo que quiero modificando Microsoft.Common.targets, comentando el código en el objective _CopyFilesMarkedCopyLocal omite por completo la copia de estos archivos. Pero no quiero alterar mi configuración global y hacer esto en todas las circunstancias. Creé mi propio archivo de objectives alternativos, que funciona si modifico un archivo de proyecto individual para señalarlo, pero no puedo encontrar la manera de especificarlo para usarlo en el nivel superior (mi archivo .proj que acaba de comstackr las 8 soluciones). Sería genial si de alguna manera pudiera anular solo el objective _CopyFilesMarkedCopyLocal en el nivel superior, de modo que si MS cambia el archivo predeterminado de objectives, mi comstackción no se arruine, pero tampoco sé cómo hacer que esto funcione.

Lo mejor sería si hubiera una manera de anular las propiedades del nivel de referencia, como puede proyectar propiedades de nivel, sin tener que reescribir / anular los objectives de comstackción, pero no he encontrado información que indique que esto sea posible.

Gracias de antemano por cualquier ayuda sobre esto.

PD. No es posible para mí examinar todos los archivos de proyectos y cambiarlos; Necesito una solución que deje el código existente en su lugar como está.

Prueba esto:

Establezca CustomAfterMicrosoftCommonTargets en C: \ foo \ filter.targets (o lo que sea que nombre el archivo) y haga que filter.targets sea:

   False    

En un archivo como filter.targets agrega un objective:

    False      

Esto volverá a crear la lista @ (Referencia) para que los metadatos ‘Privado’ se establezcan en falso, lo que asegurará que la referencia no se copie. A continuación, ejecute comstackr su solución o proyecto con la propiedad $ (CustomAfterMicrosoftCommonTargets) establecida en la ruta a este archivo filter.targets.

 msbuild foo.sln /p:CustomAfterMicrosoftCommonTargets=c:\foo\filter.targets 

De esta forma, el objective BeforeBuild se invocará antes de construir el proyecto, y todas las referencias se establecerán en consecuencia. Si desea tener más control sobre cuándo o si Private debe ser falso o verdadero, puede modificar el objective BeforeBuild y controlarlo a través de las propiedades.

Editar: podría haber una mejor manera de establecer los metadatos en el objective BeforeBuild.

Comenzando con msbuild v 15 puede copiar un solo archivo llamado Directory.Build.props en la carpeta raíz que contiene su fuente.

    False    

Esto funciona bien con Visual Studio 2017 y vNext Build. Puede tener que cerrar Visual Studio y volver a abrir la solución para tomar el efecto de archivo.

https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build#directorybuildprops-and-directorybuildtargets