.net - that - La restauración del paquete automático NuGet no funciona con MSBuild
restore nuget packages visual studio 2017 console (11)
A veces esto ocurre cuando tienes la carpeta del paquete que estás tratando de restaurar dentro de la carpeta "packages" (es decir, "Packages / EntityFramework.6.0.0 /" ) pero los "DLL" no están dentro de ella (la mayor parte del control de la versión) los sistemas automáticamente ignoran los archivos ".dll"). Esto ocurre porque antes de que NuGet intente restaurar cada paquete, comprueba si las carpetas ya existen, por lo que si existe, NuGet supone que el "dll" está dentro de él. Entonces, si este es el problema, simplemente elimine la carpeta que NuGet restaurará correctamente.
Intento crear una solución sin contenido de packages
(excepto repositories.config
inside) con MSBuild 12.0. Espero que restaure automáticamente todos los paquetes faltantes antes de compilar, pero este no es el caso. MsBuild informa toneladas de errores:
"¿Echas de menos una directiva de uso o una referencia de ensamblaje?"
NuGet Manager es 2.7 (veo esto en Visual Studio 2013 sobre el cuadro). Incluso traté de pasar EnableNuGetPackageRestore=true
parámetro - sin suerte. ¿Qué me estoy perdiendo?
En Visual Studio 2017: cuando compile usando IDE, descargará todos los paquetes Nuget que faltan y guardará en la carpeta "paquetes".
Pero en la compilación de compilación se hizo usando msbuild.exe. En ese caso, descargué nuget.exe y lo mantuve en la ruta.
Durante cada proceso de compilación antes de ejecutar msbuild.exe. Ejecutará -> nuget.exe restore NAME_OF_SLN_File (si solo hay un archivo .SLN, puede ignorar ese parámetro)
Hay un archivo packages.config con el proyecto, contiene los detalles del paquete.
También hay una carpeta .nuget que contiene NuGet.exe y NuGet.targets . si falta alguno de los archivos, no restaurará el paquete que falta y causará "¿falta una directiva de uso o una referencia de ensamblado?" error
Ian Kemp tiene la respuesta (tiene algunos puntos por cierto ...), esto es simplemente agregar un poco de carne a uno de sus pasos.
La razón por la que terminé aquí fue porque las máquinas de desarrollo estaban construyendo bien, pero el servidor de compilación simplemente no estaba retirando los paquetes necesarios (carpeta de paquetes vacíos) y, por lo tanto, la construcción estaba fallando. Sin embargo, el inicio de sesión en el servidor de compilación y la creación manual de la solución funcionaron.
Para cumplir el segundo de los pasos de 3 pasos de Ians (ejecutar la restauración nuget ), puede crear un objetivo MSBuild ejecutando el comando exec para ejecutar el comando nuget restore, como se muestra a continuación (en este caso nuget.exe está en la carpeta .nuget, en lugar de en la ruta), que luego se puede ejecutar en un paso de compilación de TeamCity (otros IC disponibles ...) inmediatamente antes de generar la solución
<Target Name="BeforeBuild">
<Exec Command="../.nuget/nuget restore ../MySolution.sln"/>
</Target>
Para el registro, ya había probado el tipo de corredor "instalador nuget", pero este paso estaba pendiente de proyectos web (funcionaba para proyectos DLL y Windows)
La restauración automática de paquetes de Nuget es una característica de Visual Studio (comenzando en 2013), no de MSBuild. Tendrá que ejecutar la nuget.exe restore
si desea restaurar paquetes desde la línea de comandos.
También puede usar la función Habilitar restauración de paquete de Nuget, pero esto ya no es recomendado por la gente nuget porque hace cambios intrusivos a los archivos del proyecto y puede causar problemas si usted construye esos proyectos en otra solución.
MSBuild 15 tiene una opción / t: restore que hace esto. viene con Visual Studio 2017.
Si desea usar esto, también debe usar la nueva PackageReference , que significa reemplazar el archivo packages.config
por elementos como este (haga esto en * .csproj):
<ItemGroup>
<!-- ... -->
<PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
<!-- ... -->
</ItemGroup>
Me llevó algo de tiempo descubrir la imagen completa y me gustaría compartirla aquí.
Visual Studio tiene dos enfoques para usar la restauración de paquetes: Restauración automática de paquetes y restauración de paquetes integrada en MSBuild. La restauración de paquete integrado de MSBuild restablece los paquetes DURANTE el proceso de creación que podría causar problemas en algunos escenarios. La ''Restauración automática de paquetes'' es docs.nuget.org/docs/workflows/… por el equipo NuGet.
Hay varios pasos para hacer que la restauración automática del paquete funcione:
En Visual Studio, Herramientas -> Extensiones y actualizaciones, Actualice NuGet si hay una versión más nueva (Versión 2.7 o posterior)
Si usa TFS, en la carpeta .nuget de su solución, elimine los archivos NuGet.exe y NuGet.targes. Luego edite NuGet.Config para no verificar en los paquetes NuGet:
<configuration> <solution> <add key="disableSourceControlIntegration" value="true" /> </solution> </configuration>
Si marcó antes la carpeta de paquetes de la solución para TFS, elimine la carpeta y verifique la eliminación de la eliminación de la carpeta del paquete.
Si no usa TFS, elimine la carpeta .nuget.
En cada archivo de proyecto (.csproj o .vbproj) en su solución, elimine la línea que hace referencia al archivo NuGet.targets. La referencia se ve así:
<Import Project="$(SolutionDir)/.nuget/NuGet.targets" Condition="Exists(''$(SolutionDir)/.nuget/NuGet.targets'')" />
Elimine esta línea en cada archivo de proyecto en su solución.
En el menú de Visual Studio, ya sea a través de
Herramientas -> Opciones -> Administrador de paquetes -> General o Herramientas -> Administrador de paquetes NuGet -> Configuración del Administrador de paquetes
habilite las siguientes dos opciones 1) ''Permitir que NuGet descargue los paquetes que faltan'' 2) ''Verifique automáticamente si faltan paquetes durante la compilación en Visual Studio''
Pruebe la configuración de restauración de su paquete siguiendo los siguientes pasos
- Guarde su solución y cierre Visual Studio
- Eliminar la carpeta de paquetes de su solución
- Inicie Visual Studio, abra su solución y reconstruya.
Nadie ha respondido la pregunta original, que es "¿cómo puedo hacer que los paquetes NuGet se restauren automáticamente cuando creas desde la línea de comandos con MSBuild?" La respuesta es: a menos que esté utilizando la opción "Habilitar la restauración del paquete NuGet" (que ahora está en desuso según esta referencia ), no puede (pero consulte a continuación). Si está tratando de hacer, por ejemplo, compilaciones automatizadas en un servidor de CI, esto apesta.
Sin embargo, hay una manera un poco indirecta de obtener el comportamiento deseado:
- Descargue el último ejecutable de NuGet desde https://dist.nuget.org/win-x86-commandline/latest/nuget.exe y colóquelo en algún lugar de su RUTA. (Puede hacer esto como un paso previo a la compilación).
- Ejecuta
nuget restore
que descargará automáticamente todos los paquetes faltantes. - Ejecute
msbuild
para construir su solución.
Aparte: si bien la nueva y recomendada forma de restaurar el paquete automático implica menos desorden en el control de su versión, también hace que la restauración del paquete de línea de comando sea imposible a menos que salte a través del aro adicional de descargar y ejecutar nuget.exe
. ¿Progreso?
Tenga en cuenta que si usa TeamCity como servidor de compilación, obtendrá un paso "Instalador NuGet" que puede usar para restaurar todos los paquetes antes del paso de compilación.
Tuve un problema con los paquetes nuget que no se incluyeron en una compilación nocturna con guiones que crea el archivo sln con devenv.exe.
Seguí el consejo de Microsoft , y el paso clave fue actualizar la configuración de NuGet en %AppData%/NuGet
para que contuviera:
<configuration>
<packageRestore>
<add key="automatic" value="True" />
</packageRestore>
</configuration>
ACTUALIZADO con la última documentación oficial de NuGet a partir de v3.3.0
Enfoques de restauración de paquetes
NuGet ofrece tres enfoques para usar la restauración de paquetes .
La restauración automática de paquetes es el enfoque recomendado por el equipo NuGet para la restauración de paquetes dentro de Visual Studio, y se introdujo en NuGet 2.7. A partir de NuGet 2.7, la extensión NuGet Visual Studio se integra en los eventos de compilación de Visual Studio y restaura los paquetes faltantes cuando comienza una compilación. Esta característica está habilitada de manera predeterminada, pero los desarrolladores pueden optar por no participar si así lo desean.
Así es como funciona:
- En la creación de proyectos o soluciones, Visual Studio plantea un evento en el que se inicia una compilación dentro de la solución.
- NuGet responde a este evento y comprueba los archivos packages.config incluidos en la solución.
- Para cada archivo packages.config encontrado, sus paquetes se enumeran y se comprueba que existen en la carpeta de paquetes de la solución.
- Los paquetes faltantes se descargan de las fuentes del paquete configuradas (y habilitadas) del usuario, respetando el orden de las fuentes del paquete.
- A medida que se descargan los paquetes, se descomprimen en la carpeta de paquetes de la solución.
Si tiene instalado Nuget 2.7+; es importante elegir un método para> administrar la restauración automática de paquetes en Visual Studio.
Dos métodos están disponibles:
- (Nuget 2.7+): Visual Studio -> Herramientas -> Administrador de paquetes -> Configuración de Package Manager -> Activar restauración automática de paquetes
- (Nuget 2.6 y siguientes) Haga clic con el botón derecho en una solución y haga clic en "Habilitar restauración de paquetes para esta solución".
La restauración del paquete de la línea de comandos es necesaria al construir una solución desde la línea de comandos; se introdujo en las primeras versiones de NuGet, pero se mejoró en NuGet 2.7.
nuget.exe restore contoso.sln
El enfoque de restauración de paquetes integrado en MSBuild es la implementación original de Restauración de paquetes y aunque continúa funcionando en muchos escenarios, no cubre el conjunto completo de escenarios abordados por los otros dos enfoques.