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

283

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 mantengo bibliotecas externas dentro de la carpeta de origen. También estoy muy interesado en usar NuGet pero no quiero estas bibliotecas externas dentro de la carpeta de origen. ¿NuGet tiene una configuración para cambiar el directorio en el que se cargan todos los paquetes?

TheCloudlessSky
fuente
10
¡Si si si! Esta es exactamente la estructura del proyecto que uso (o muy, muy cerca), y siempre me he preguntado con NuGet si podría soportarlo ...
Noldorin
He entrado en detalles sobre cómo hacer esto con esta siguiente respuesta: stackoverflow.com/a/19466173/564726 . A menudo necesita eliminar la opción solutionDir del comando de restauración para que funcione correctamente.
BrutalDev
2
Puse el .sln al mismo nivel que sus carpetas de nivel superior. :)
Ian Warburton

Respuestas:

242

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.

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

<settings>
<repositoryPath>{some path here}</repositoryPath>
</settings>

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 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 los lugares válidos para colocar los archivos de configuración y cómo funciona el modelo de configuración jerárquica):

<configuration>
  <config>
    <add key="repositoryPath" value="C:\thePathToMyPackagesFolder" />
  </config>
  ... 
</configuration>

Esto cambiaría la carpeta de paquetes para el nivel de configuración en el que coloca el archivo (solución si lo coloca en el directorio de la solución, 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 su solución, deberá eliminarla antes de que NuGet coloque los paquetes en la nueva ubicación.

PHeiberg
fuente
55
En realidad, es posible utilizando el archivo de configuración anterior. La razón por la que se dejó de enfatizar es porque no lo hemos hecho a través del flujo de trabajo de habilitar esto a través de la interfaz de usuario y otros medios, por lo que esperamos algunas peculiaridades.
davidfowl
55
Consulte reviewboard.nupack.com/r/131 para obtener una descripción completa de @dfowler de cómo funciona nuget.config. Por ejemplo, un nuget.config válido se vería así: <settings><repositoryPath>lib</repositoryPath> </settings>
Lee Harold
55
docs.nuget.org/docs/release-notes/nuget-2.1 Consulte el párrafo "Especificar la ubicación de la carpeta 'paquetes'"
Azat
1
Puedo confirmar que la nueva forma de hacer las cosas en 2.1+ no funciona. Y hay errores al respecto en codeplex: nuget.codeplex.com/workitem/2921 .
Caso
55
La segunda versión funciona para mí, uso el último NuGet, y ahora dos soluciones pueden compartir el mismo repositorio. Creo que puede no funcionar algunas personas porque podrían usar rutas absolutas? Parece que el camino absoluto vs. relativo importa.
Csaba Toth
63
  1. Creó un archivo llamado "nuget.config".
  2. Agregué ese archivo a mi carpeta de soluciones

Esto no funcionó para mí:

<configuration>
  <config>
    <add key="repositoryPath" value="..\ExtLibs\Packages" />
  </config>
  ... 
</configuration>

esto funcionó para mí:

<?xml version="1.0" encoding="utf-8"?>
<settings>
  <repositoryPath>..\ExtLibs\Packages</repositoryPath>
</settings>
ShaneKm
fuente
Igual que aquí. La configuración> config no funcionó, pero la configuración> repositoryPath sí.
Gene Reddick
Solo la segunda solución funciona: docs.nuget.org/docs/reference/nuget-config-file
cheesemacfly
15
Depende de la versión de NuGet que esté utilizando.
Bronumski el
1
Tenga en cuenta que las rutas relativas son relativas a la solución, por lo que si sus proyectos están en diferentes niveles, entonces no funcionará.
Nueve Colas
2
Esto funciona bien para VIsual Studio 2013, pero si estoy usando Visual Studio 2015, entonces todavía instala paquetes en la carpeta de paquetes cerca del archivo sln,
fhnaseer
40

Bien, por el bien de cualquiera que lea esta publicación, esto es lo que entiendo de la miríada 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 '../Packs', eso la colocará donde siempre sale de la caja. Como @ bruce14 dice que debes hacer '../../Packs' en su lugar

  2. No pude obtener el último 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:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      ...
      <config>
        <add key="repositoryPath" value="..\..\Packages" />
      </config>
      ...
    </configuration>
  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

Robert Petz
fuente
55
Confía en mí, tu punto # 3 me salvó el día. Estaba loco desde las últimas 3 horas hasta que leí tu punto # 3. : '(¡Muchas gracias hermano!
hellodear
24

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

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <config>
        <add key="repositoryPath" value="../lib" />
    </config>
</configuration>

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

La referencia está disponible aquí.

phuongnd
fuente
¡Perfecto! Trabajando para Visual Studio 2015 y Nuget versión 3.2.0.10516
Anon Dev
Parece que has querido decir una barra diagonal ... pero si la solución está en Windows, tal vez esa barra diagonal se convierta en una barra hacia atrás, o tal vez la barra diagonal sea el error tipográfico y deba cambiar a una barra hacia atrás.
Gerard ONeill
Estoy en 2015 y necesito usar ... \ .. \ Paquetes para que suba una carpeta.
Rhyous
1
../libEsa es una barra diagonal, no una barra diagonal. ¿A qué te refieres?
jpmc26
Sí, exactamente es una barra diagonal. Respuesta actualizada
phuongnd
15

La solución propuesta en las notas de la versión 2.1 no funciona de manera inmediata. Se olvidaron de mencionar que hay código:

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

    ...
}

lo que evita que funcione. Para solucionar esto, debe modificar su archivo NuGet.targets y eliminar el parámetro 'OutputDirectory':

    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch)</RestoreCommand>

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 colocar los archivos de configuración), restaurará todos los paquetes en una sola ubicación, pero ... Su .csproj aún contiene sugerencias para ensamblados escritos como rutas relativas ...

Todavía no entiendo por qué fueron tan difíciles en lugar de cambiar PackageManager, por lo que agregaría rutas de pistas en relación con PackagesDir. Así es como lo hago manualmente para tener diferentes ubicaciones de paquetes localmente (en mi escritorio) y en el agente de compilación.

<Reference Include="Autofac.Configuration, Version=2.6.3.862, Culture=neutral, PublicKeyToken=17863af14b0044da, processorArchitecture=MSIL">
  <Private>True</Private>
  <HintPath>$(PackagesDir)\Autofac.2.6.3.862\lib\NET40\Autofac.Configuration.dll</HintPath>
</Reference>
Dmitry Naumov
fuente
1
Tienes toda la razón. En mi empresa, en realidad utilizamos una versión de NuGet que modificamos nosotros mismos que hace exactamente lo que está describiendo, es decir, agrega HintPaths en relación con el Dir de paquetes, no en relación con la ubicación del archivo del proyecto. Esto funciona perfectamente bien. Desafortunadamente, nunca intentamos introducir los cambios que hicimos en NuGet a la versión oficial, pero tal vez es hora de hacerlo ahora ...
afrischke
1
@afrischke: eso sería genial si pudieras hacer eso. Gracias. ¿Alguna idea de cuándo podría suceder esto?
sgtz
11

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

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <repositoryPath>..\..\ExtLibs\Packages</repositoryPath>
</configuration>

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

usuario
fuente
9

Ninguna de estas respuestas me funcionó (Nuget 2.8.6) debido a la falta de algunos consejos, trataré de agregarlos aquí, ya que podría ser útil para otros.

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

  1. Para facilitar el trabajo Install-paquete correctamente con diferentes repositoryPath es necesario utilizar hacia adelante barras, es porque están usando objeto Uri a la ubicación de análisis.
  2. Sin $ al principio, todavía ignoraba mi configuración.
  3. NuGet almacena en caché el archivo de configuración, 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 configurar esta opción, ya que modificó mi NuGet.exe global en AppData \ Roaming \ NuGet y comenzó a restaurar paquetes allí (ya que ese archivo tiene mayor prioridad, solo adivinando).

P.ej

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
  <config>
    <add key="repositorypath" value="$/../../../Common/packages" />
  </config>
</configuration>

También puede usar el comando NuGet para asegurarse de que la sintaxis sea correcta como esta:

NuGet.exe config -Set repositoryPath=$/../../../Common/packages -ConfigFile NuGet.Config
Roman Badiornyi
fuente
8

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

<configuration>
  <config>
    <add key="globalPackagesFolder" value="lib" />
  </config>
  ... 
</configuration>

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 comandos y la reconstrucción de Visual Studio 2017

Kirill Chilingarashvili
fuente
Intenté esto Configuré la globalPackagesFolderclave de la carpeta del paquete de mi proyecto. Traté de agregar un solo paquete con dotnet add package MyPackage. nuget.exedescargó el marco completo de 83 paquetes .NET en esa carpeta. Eso no es lo que pretendía. Solo quería mi único MyPackage en mi carpeta de paquetes local controlada por código fuente.
Wallace Kelly
¡NO HAGAS ESO! Esto abrumará su HDD bastante rápido, ya que todos los paquetes de framework se descargarán cada vez que cree una nueva aplicación.
Alaa Masoud
1
según esta respuesta a otra pregunta: stackoverflow.com/a/47407399/4572240 "respositoryPath se usa para los paquetes.config proyectos, globalPackagesFolder se usa para los proyectos PackageReference".
Siderite Zackwehdex
7

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.

Harald
fuente
Reiniciar VS es la única forma de hacer que esto funcione. Supongo que el administrador de paquetes lo almacena en caché.
Filip
6

Para cambiar la ruta de los proyectos que usan PackageReference en lugar de packages.config, debe usar globalPackagesFolder

Desde https://docs.microsoft.com/en-us/nuget/reference/nuget-config-file

globalPackagesFolder (proyectos que usan PackageReference solamente)

La ubicación de la carpeta de paquetes globales predeterminada. El valor predeterminado es% userprofile% .nuget \ packages (Windows) o ~ / .nuget / packages (Mac / Linux). Se puede usar una ruta relativa en archivos nuget.config específicos del proyecto. Esta configuración es anulada por la variable de entorno NUGET_PACKAGES, que tiene prioridad.

repositoryPath (paquetes.config solamente)

La ubicación en la que instalar los paquetes NuGet en lugar de la carpeta predeterminada $ (Solutiondir) / packages. Se puede usar una ruta relativa en archivos nuget.config específicos del proyecto. Esta configuración es anulada por la variable de entorno NUGET_PACKAGES, que tiene prioridad.

<config>
    <add key="globalPackagesFolder" value="c:\packageReferences" />
    <add key="repositoryPath" value="c:\packagesConfig" />
</config>

Puse Nuget.config al lado de mi archivo de solución y funcionó.

Manny
fuente
5

Un pequeño dato más 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 "paquetes" 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.

NickNuke
fuente
4

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. Entonces, ahora (si no me equivoco, ya que aún no migró a VS 2017), lo siguiente ya no es necesario. Debería poder establecer el "repositoryPath" en una carpeta local y funcionará. Incluso puede dejarlo ya que, de forma predeterminada, la ubicación de restauración se movió de las carpetas de soluciones al nivel de la máquina. De nuevo, 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 del paquete NuGet se puede cambiar mediante la configuración, pero VisualStudio todavía hace referencia a los ensamblados en esta carpeta relativamente:

<HintPath>..\..\..\..\..\..\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

Para solucionar esto (hasta una mejor solución), utilicé el comando subst para crear una unidad 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 utiliza su ubicación absoluta:

<HintPath>N:\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath>

Nota:

  1. Dicha unidad virtual se eliminará después del reinicio, así que asegúrese de manejarla
  2. No olvide reemplazar las referencias existentes en los archivos del proyecto.
Kamarey
fuente
¿Sigue siendo el caso hoy? ¿Quiero decir que no podemos usar una ubicación absoluta para nuevos paquetes agregados? esta solución de disco virtual me parece engorrosa
batmaci
Sí, sigue siendo un caso, ya que nada cambió
Kamarey
2
De hecho, prefiero una ruta relativa, de esa manera no hay conflicto en el control de la fuente si diferentes desarrolladores tienen diferentes ubicaciones de raíz para el código.
jbyrd
Me pregunto por qué no puedes hacer en <HintPath>$(SolutionDir)\packages\SomeAssembly\lib\net45\SomeAssembly.dll</HintPath> lugar de usarsubst
Vinod Srivastav
Quería que todos los paquetes estuvieran en un solo lugar, no por solución
Kamarey
3

Simplemente actualizando con Nuget 2.8.3. Para cambiar la ubicación de los paquetes instalados, habilité la restauración del paquete haciendo clic con el botón derecho en la solución. Editó NuGet.Config y agregó estas líneas:

  <config>
    <add key="repositorypath" value="..\Core\Packages" />
  </config>

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

amarnath chatterjee
fuente