2011-06-08 10 views
17

Estoy tratando de averiguar cuál es la mejor forma de manejar este escenario.Nu-Get & Problema con las dependencias de nivel de proyecto para proyectos a los que hacen referencia las soluciones múltiples

Digamos que tengo una biblioteca a la que hacen referencia diferentes soluciones no relacionadas, llamémosla WebServiceInterface.dll. Esta biblioteca tiene una dependencia en JSON.NET.

Antes NuGet

El binario JSON.NET se hace referencia a través de un SVN externa en el proyecto WebServiceInterface. Otras soluciones que tenían una dependencia en WebServiceInterface hicieron referencia al proyecto (también como SVN externo) y, como resultado, extrajeron tanto el proyecto como sus dependencias.

Con NuGet

no he descubierto la manera de forzar la referencia JSON.NET para ser almacenado bajo el proyecto WebServiceInterface (en oposición a la ubicación de los paquetes RandomSolution \). Encontré reference @ nu-get en pacakges a nivel de proyecto y de nivel de solución, pero parece que no puedo encontrar la forma de especificar esto cuando agrego una dependencia a través de nu-get.

El objetivo aquí es que cuando alguien revisa WebServiceInterface y lo agrega a una nueva solución que construye (en lugar de tener referencias rotas a JSON.NET que apuntan al directorio de paquetes con la última solución que ingresó) .

Respuesta

4

Los paquetes son siempre almacenados en el nivel de solución, por lo que si instala un paquete en varios proyectos, provienen del mismo lugar. No creo que pueda configurarlo para que cada proyecto tenga su propia carpeta de paquetes.

No estoy seguro de que haya una buena manera de hacer lo que está intentando. Tal vez podría tener un build step en el proyecto que obtiene el paquete, pero no sé qué tan bien le conviene.

Recomiendo publicar en el NuGet Issue Tracker para continuar la discusión. Las personas que trabajan en él parecen bastante activas, por lo que podría ser algo en lo que puedan agregar soporte en una versión futura :-)

+0

Gracias - como solución alternativa, simplemente cambié las dependencias de los paquetes NuGet también en un servidor interno, y la resolución de dependencia integrada la hace "funcionar". No es ideal, sin embargo. Seguiré con el rastreador de problemas. –

23

Cuando fui a averiguar si Chris B había creado un problema NuGet para esto, no pude t encuentra uno. EDITAR: lo hizo, ver su comentario a continuación. Pero encontré una característica semi-documentada de NuGet que he utilizado para resolver este problema: Allow specifying the folder where packages are installed

Déjame romper esta pregunta en 2 temas:

  1. conseguir NuGet para permitir múltiples soluciones para utilizar los mismos paquetes de ubicación
  2. conseguir los paquetes NuGet a buscar automágicamente de control de código fuente cuando se incluye un proyecto que tiene paquetes NuGet

Problema 1: Por defecto NuGet paquete de tiendas s en una carpeta de paquetes en la carpeta de la solución. Para cambiar esa ubicación, cree un archivo nuget.config en la carpeta raíz de la solución con el siguiente contenido:

<settings> 
<repositoryPath>..\..\..\Utilities\Library\nuget.packages</repositoryPath> 
</settings> 

<repositoryPath> es relativo a su solución; así que obviamente hazlo como quieras. Haga que cada solución tenga su propia ruta relativa a la misma carpeta de paquetes.

En cuanto al flujo de NuGet, a partir de ese punto, las rutas en repositories.config son relativas a la carpeta que contiene repositories.config, no la solución, por lo que ahora todos los proyectos/paquetes se gestionan independientemente de la ubicación de la solución.

Esto permite que múltiples soluciones utilicen los mismos paquetes en control de fuente, y si esas soluciones usan los mismos proyectos (que usan paquetes NuGet), esas soluciones/proyectos se mantendrán sincronizados sin importar qué solución actualice el paquete.

Problema 1 completamente resuelto.

Problema 2:

permítanme abordar esto desde 2 perspectivas. Esto se aplica a Visual Studio y TFS: dejaré el SVN para que lo dirija otra persona.

Primero: si no tiene un código fuente en su disco y obtiene una solución (no es un proyecto), prefiero hacerlo para que pueda obtener todo lo que la solución necesita para construir. No debería haber referencias faltantes para ir a agarrar manualmente. Todo lo que podemos hacer es agregar los archivos del paquete como elementos de solución. Sí, en cada solución. Un poco de trabajo, sí, pero cuando termine, los archivos del paquete buscarán/actualizarán desde el control de origen automágicamente.

Segundo: en una nueva solución, cuando incluye un proyecto de control de fuente existente que tiene paquetes NuGet, tiene que obtener manualmente los paquetes del control de origen y agregarlos como elementos de solución. Al menos cualquier otra persona que obtenga su solución en el futuro obtendrá automágicamente todo lo que necesita para construir con éxito. Al menos con VS/TFS, así es como es, AFAIK. Si projB depende de projA, y agrega projB a una nueva solución, VS/TFS no tomará automáticamente projA de TFS. Tienes que hacer eso manualmente. Entonces, lo mismo ocurre con las referencias dll (como paquetes NuGet).

Resumen de mi solución:

  • Sólo una copia de los paquetes de control de código fuente para todas las soluciones
  • Cualquier solución puede actualizar paquetes y todas las otras soluciones se mantienen sincronizados *

* Una vez que una solución actualiza paquetes a nuevas rutas o nombres de archivos, aparecerán como referencias faltantes a las otras soluciones y deberá limpiarlas manualmente. Pero al menos sabes exactamente dónde están los paquetes en control de fuente "(a diferencia de la ubicación RandomSolution \ packages)."

+1

Aquí estaba el comentario original que puse - http://nuget.codeplex.com/discussions/261930 - Actualmente voy a dar la nueva funcionalidad de Restauración de paquetes - http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages un disparo, ya que parece que terminará dándome un sistema viable –

+0

Package Restore parece prometedor. Por favor, háganos saber cómo funciona para usted! – minnow

+0

Si lee los comentarios recientes de ecousa sobre estos 2 números: http://nuget.codeplex.com/workitem/215?PendingVoteId=215, http://nuget.codeplex.com/workitem/1990 - esto podría ser un solución al problema 2 –

Cuestiones relacionadas