supported referencia parameter not name invalid cultural admite .net msbuild

.net - referencia - culture is not supported. parameter name name es-419 is an invalid culture identifier



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

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

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemDefinitionGroup> <Reference> <Private>False</Private> </Reference> </ItemDefinitionGroup> </Project>

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

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 compilació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 objetivo _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 objetivos 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 compilar las 8 soluciones). Sería genial si de alguna manera pudiera anular solo el objetivo _CopyFilesMarkedCopyLocal en el nivel superior, de modo que si MS cambia el archivo predeterminado de objetivos, mi compilació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 objetivos de compilació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á.


En un archivo como filter.targets agrega un objetivo:

<Target Name="BeforeBuild"> <ItemGroup> <ReferenceNew Include="@(Reference)"> <Private>False</Private> </ReferenceNew> <Reference Remove="@(Reference)"/> <Reference Include="@(ReferenceNew)"/> </ItemGroup> </Target>

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 compilar 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 objetivo 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 objetivo BeforeBuild y controlarlo a través de las propiedades.

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


Prueba esto:

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

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemDefinitionGroup> <Reference> <Private>False</Private> </Reference> </ItemDefinitionGroup> </Project>