¿Es posible cambiar la ubicación de los paquetes para NuGet?

Tengo la siguiente convención para la mayoría de mis proyectos:

/src /Solution.sln /SolutionFolder /Project1 /Project2 /etc.. /lib /Moq moq.dll license.txt /Yui-Compressor yui.compressor.dll /tools /ILMerge ilmerge.exe 

Notarás que no guardo bibliotecas externas dentro de la carpeta fuente. También estoy muy interesado en usar NuGet pero no quiero estas bibliotecas externas dentro de la carpeta fuente. ¿Tiene NuGet una configuración para cambiar el directorio en el que se cargan todos los paquetes?

Ahora es posible controlar en qué carpeta están instalados los paquetes.

http://nuget.codeplex.com/workitem/215

Editar: vea el comentario de Phil Haack el 10 de diciembre de 2010 a las 11:45 p. M. (En el elemento de trabajo / el enlace de arriba). El soporte se implementa parcialmente en 1.0, pero no está documentado.

Según @dfowler: Agregue un archivo nuget.config junto a la solución con esto:

  {some path here}  

Hay un paquete nuget para crear la anulación de la carpeta del paquete.

Actualización para la versión 2.1

Como comentó Azat, ahora hay documentación oficial sobre cómo controlar las ubicaciones de los paquetes. Las notas de la versión para 2.1 especifican la siguiente configuración en un archivo nuget.config (consulte las notas de la versión para obtener una descripción de lugares válidos para poner los archivos de configuración y cómo funciona el modelo de configuración jerárquica):

     ...  

Esto cambiaría la carpeta de paquetes para el nivel de configuración en el que coloca el archivo (solución si la coloca en el directorio de soluciones, proyecto en el directorio del proyecto, etc.). Tenga en cuenta que las notas de la versión indican:

[…] si tiene una carpeta de paquetes existente debajo de la raíz de la solución, deberá eliminarla antes de que NuGet coloque los paquetes en la nueva ubicación.

  1. Creó un archivo llamado “nuget.config”.
  2. Agregué ese archivo a mi carpeta de soluciones

Esto no funcionó para mí:

     ...  

esto funcionó para mí:

   ..\ExtLibs\Packages  

De acuerdo, por el bien de cualquier otra persona que lea esta publicación, esto es lo que entiendo de la gran cantidad de respuestas anteriores:

  1. El archivo nuget.config en la carpeta .nuget es relativo a esa carpeta. Esto es importante porque si su nueva carpeta es algo así como ‘../Packages’ que lo colocará donde siempre sale de la caja. Como @ bruce14 indica que debe hacer ‘../../Paquetes’ en su lugar

  2. No pude obtener la última nuget (2.8.5) para encontrar una carpeta de paquetes fuera de la ubicación estándar sin habilitar la restauración del paquete. Entonces, una vez que habilite la restauración del paquete, se debe agregar lo siguiente al archivo nuget.config dentro de la carpeta .nuget para cambiar la ubicación:

       ...    ...  
  3. (Esto es importante) Si realiza CUALQUIER cambio en la ubicación de la carpeta del paquete dentro de los archivos nuget.config, debe reiniciar Visual Studio o cerrar / volver a cargar la solución para que los cambios surtan efecto.

Una solución para Nuget 3.2 en Visual Studio 2015 es:

       

Usando barra inclinada para la carpeta principal. Guarde el archivo anterior (nuget.config) en la carpeta de la solución.

La referencia está disponible aquí

La solución propuesta en las notas de la versión para 2.1 no funciona de fábrica. Olvidó mencionar que hay un código:

 internal string ResolveInstallPath() { if (!string.IsNullOrEmpty(this.OutputDirectory)) { return this.OutputDirectory; } ISettings settings = this._configSettings; ... } 

que le impide trabajar. Para solucionar esto, necesita modificar su archivo NuGet.targets y eliminar el parámetro ‘OutputDirectory’:

  $(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" $(RequireConsentSwitch) 

Entonces, si agrega la configuración ‘repositoryPath’ en algún lugar de NuGet.config (consulte las notas de la versión para obtener una descripción de los lugares válidos para poner los archivos de configuración), restaurará todos los paquetes en una sola ubicación, pero … Su .csproj aún contiene sugerencias para ensamblajes escritos como rutas relativas …

Todavía no entiendo por qué fueron tan difíciles en lugar de cambiar PackageManager, por lo que se agregarían rutas de sugerencias relativas a PackagesDir. Así es como lo hago manualmente para tener localizaciones de paquetes diferentes localmente (en mi escritorio) y en agente de comstackción.

  True $(PackagesDir)\Autofac.2.6.3.862\lib\NET40\Autofac.Configuration.dll  

Además de la respuesta de Shane Kms, si activó Nuget Package Restore, edite el NuGet.config que se encuentra en la carpeta .nuget de la siguiente manera:

   ..\..\ExtLibs\Packages  

Observe el extra “.. \”, ya que retrocede desde la carpeta .nuget y no desde la carpeta de la solución.

El archivo de configuración en la respuesta aceptada funciona para mí en VS2012. Sin embargo, para mí solo funciona cuando hago lo siguiente:

  1. Crea un nuevo proyecto en VS.
  2. Salir VS: esto parece ser importante.
  3. Copie los archivos de configuración a la carpeta del proyecto.
  4. Reinicie VS y agregue paquetes.

Si sigo esos pasos, puedo usar una carpeta de paquete compartido.

Ninguna de estas respuestas funcionó para mí (Nuget 2.8.6) porque me faltaron algunos consejos, intentaré agregarlos aquí ya que podría ser útil para otros.

Después de leer las siguientes fonts:
https://docs.nuget.org/consume/NuGet-Config-Settings
https://github.com/NuGet/Home/issues/1346
Parece que

  1. Para hacer que Install-Package funcione correctamente con diferentes repositoryPath debes usar barras diagonales, es porque están usando el objeto Uri para analizar la ubicación.
  2. Sin $ al principio todavía ignoraba mi configuración.
  3. NuGet almacena el archivo de configuración en caché, por lo que después de las modificaciones debe volver a cargar la solución / VS.
  4. También tuve un problema extraño al usar el comando de NuGet.exe para establecer esta opción, ya que modificó mi NuGet.exe global en AppData \ Roaming \ NuGet y comencé a restaurar los paquetes allí (ya que ese archivo tiene una prioridad más alta, solo adivinar).

P.ej

          

También puede usar el comando NuGet para asegurarse de que la syntax sea correcta así:

 NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config 

Para los proyectos .NET Core y Visual Studio 2017, pude restaurar todos los paquetes a la ruta relativa al proporcionar esta configuración:

     ...  

Según mi experiencia, la carpeta lib se creó en el mismo nivel donde se encontró Nuget.config, sin importar dónde estaba el archivo sln. Probé y el comportamiento es el mismo para la restauración de dotnet de línea de comando y la reconstrucción de Visual Studio 2017

Un pequeño detalle que acabo de descubrir. (Esto puede ser tan básico que algunos no lo han mencionado, pero fue importante para mi solución.) La carpeta “packages” termina en la misma carpeta que su archivo .sln.

Movimos nuestro archivo .sln y luego arreglamos todos los caminos para encontrar los diferentes proyectos y ¡listo! Nuestra carpeta de paquetes terminó donde la queríamos.

ACTUALIZACIÓN para VS 2017:

Parece que la gente del equipo de Nuget finalmente comenzó a usar Nuget, lo que les ayudó a encontrar y solucionar varias cosas importantes. Así que ahora (si no me equivoco, ya que todavía no migró a VS 2017), a continuación ya no es necesario. Debería poder establecer el “repositoryPath” en una carpeta local y funcionará. Incluso puede dejarlo porque la ubicación de restauración predeterminada se trasladó de las carpetas de solución al nivel de la máquina. Nuevamente, todavía no lo probé solo

VS 2015 y anteriores

Solo un consejo para otras respuestas (específicamente esto ):

La ubicación de la carpeta NuGet Package se puede cambiar a través de la configuración, pero VisualStudio todavía hace referencia a los ensamblados en esta carpeta de manera relativa:

 ..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll 

Para solucionar esto (hasta una solución mejor) utilicé el comando subst para crear un controlador virtual que apunta a una nueva ubicación de la carpeta Paquetes:

 subst N: C:\Development\NuGet\Packages 

Ahora, al agregar un nuevo paquete NuGet, la referencia del proyecto usa su ubicación absoluta:

 N:\SomeAssembly\lib\net45\SomeAssembly.dll 

Nota:

  1. Un tal controlador virtual se eliminará después de reiniciar, así que asegúrese de manejarlo
  2. No olvides reemplazar las referencias existentes en los archivos del proyecto.

Simplemente actualizando con Nuget 2.8.3. Para cambiar la ubicación de los paquetes instalados, habilité la restauración de paquetes desde la opción de clic derecho. Editó NuGet.Config y agregó estas líneas:

     

Luego reconstruí la solución, descargó todos los paquetes a mi carpeta deseada y actualizó las referencias automáticamente.

La forma más consistente es mediante el uso de nuget config para nuget config correctamente la configuración:

 nuget config -set repositoryPath=c:\packages -configfile c:\my.config 

https://docs.microsoft.com/en-us/nuget/consume-packages/configuring-nuget-behavior#changing-config-settings