Tengo Visual Studio Solution con más de 100 proyectos. Cinco de ellos tienen instalados los paquetes nuget de Fody (versión 6.0.3). Cuando intento construir la solución, aparece el siguiente error:
Fody.6.3.0\build\Fody.targets(38,12): error MSB4086: se intentó una comparación numérica en "$(MsBuildMajorVersion)" que se evalúa como "" en lugar de un número, en la condición "($(MsBuildMajorVersion) <16)"
Después de esta compilación fallida, trato de compilar repetidamente y después de varios intentos (a veces uno, a veces cinco) la construcción termina con éxito. Estaba tratando de reinstalar todos los paquetes nuget, borrar los cachés nuget, reinstalar Visual Studio, configurar la variable MSBUILDDISABLENODEREUSE y nada ayudó.
Visual Studio 2019 está en la versión 16.8.4 y todos los proyectos tienen .NET Framework en la versión 4.8.
ACTUALIZAR:
El problema existe solo en mi máquina. En las estaciones de trabajo de los colegas, todo funciona bien. Encontré la sugerencia de que después de una compilación fallida, Visual Studio debe reiniciarse y el proceso de compilación es exitoso. Este consejo es una solución suficiente para mí.
La solución al problema fue migrar de packages.config a PackageReference . Puede hacer esto en Visual Studio 2019: dentro del Explorador de soluciones , expanda su proyecto, luego haga clic con el botón derecho del mouse en las Referencias y elija Migrate packages.config to PackageReference... .
Intente instalar el paquete nuget Costura.Fody más reciente además en esos cinco proyectos y también intente actualizar el paquete Fody Fody a la última versión 6.3.0 .
Y luego reconstruya su proyecto para verificar si ocurre el problema.
Pude solucionar este problema agregando código .csproj para restaurar nugets (simplemente copiado del proyecto creado en VS 2017). La conversión de packages.config a PackageReference también funcionó para mí, pero causa algunos otros problemas cuando se compila con msbuild.
Necesita agregar las siguientes líneas al final del primer PropertyGroup
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir> <RestorePackages>true</RestorePackages> </PropertyGroup>Y siguiendo la línea de destino de GuaranteeNuGetPackageBuildImports:
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">Ver captura de pantalla adjunta para más detalles: