Sistemas de gestión de dependencias .NET

8

Tengo algunos proyectos .NET que están comenzando a ser lo suficientemente grandes como para merecer analizar las soluciones de Administración de dependencias, por lo que no tenemos que copiar binarios de un proyecto a otro. Esto es lo que he encontrado hasta ahora:

  • NPanday se basa en un puerto de Maven. No puedo decir qué tan recientemente se trabajó, pero el último lanzamiento fue en mayo de 2011.
  • NuGet parece estar en desarrollo activo, y parece tener soporte directamente de Microsoft. Algunas personas se quejaron de que "solo aborda la resolución de dependencia", pero no sé qué más debería abordar, o si ha agregado más funciones desde ese momento. Parece haber agregado recientemente la capacidad de importar binarios como parte del proceso de compilación, por lo que no tenemos que comprometerlos en nuestros repositorios.
  • Parece que Refix todavía está en Beta, después de no haber recibido atención desde septiembre de 2011.

¿Alguien con experiencia reciente en el uso de alguna de estas herramientas de administración de dependencias (o cualquier otra que funcione bien) compartiría su experiencia? ¿NuGet es lo suficientemente maduro como para usarlo para la gestión de dependencias? Si no, ¿qué le falta?

StriplingWarrior
fuente
1
Te perdiste la envoltura abierta .
Oded
Estoy desarrollando uno, todavía está en alfa, pero se usa con éxito en nuestra empresa (más de 50 desarrolladores). Todavía no hay documentos, pero es de código abierto. NuGet no funcionó tan bien como Refix y NPanday (que es un complemento feo de Maven).
Ivan G.
@aloneguid: ¿Puedes compartir las razones por las que NuGet no funcionó para ti?
StriplingWarrior
NuGet? Simplemente parece sucio, a veces ejecuta scripts de PS desde paquetes, tiene dependencia de PS implícitamente (puede argumentar, pero lo hace). Demasiado pesado en un VS. No (o no) detectó conflictos de versión.
Ivan G.
@aloneguid: Suponga que no sé nada sobre este tema. ¿Qué quieres decir con PS / VS?
StriplingWarrior

Respuestas:

5

NuGet probablemente sería mi respuesta. Después de trabajar el precursor (Nu) que estaba sentado encima de RubyGems, puedo decir que tener recursos para algo ayuda. Ahora, una vez que terminé el trabajo, terminé con una versión parcheada del ejecutable porque teníamos un repositorio local además de los remotos. No estoy seguro de si solucionaron ese problema todavía o no, pero dado que están aceptando parches, debería ser fácil de corregir. En todos los proyectos de código abierto en el campo .NET en el que trabajo, ahora lo hacemos todo a través de NuGet. Es mucho más fácil, aunque publicar la cadena lleva un poco más de tiempo.

OpenWrap es una opción, pero todo necesita ser construido. Lo cual es un dolor en el trasero. Si no puede hacer que el proyecto se desarrolle correctamente, le llevará un tiempo tratarlo. Openwrap ha estado tratando de resolver esto durante mucho tiempo y todavía es realmente incómodo. La distribución solo binaria es mucho más fácil (a veces) ...

Los otros dos no estoy familiarizado. Así que no puedo comentar sobre ellos una tonelada.

Travis
fuente
NuGet es como la transición de un principiante a la gestión de paquetes. Probablemente solo ayude a descargar paquetes más fácilmente, pero no estoy seguro de que haga más que eso. Compárelo con Maven para comprender qué debe hacer un sistema de gestión de dependencias.
Ivan G.
1
@aloneguid: Entonces, dado que soy un principiante en la administración de paquetes, ¿sería NuGet un primer paso lógico para mí hasta que determine que tengo necesidades adicionales que no se están cumpliendo?
StriplingWarrior
@aloneguid Consulte la función de restauración de paquetes NuGet que se introdujo en NuGet 2.7. Parece que puede acercar un poco a NuGet a las capacidades de administración de dependencias de Maven.
Martin Klinke
2

Acabo de descargar una última versión de NuGet para ver qué ha cambiado desde la última vez. Corrígeme si me equivoco (realmente estoy considerando migrar mis cosas a Nuget):

Los paquetes NuGet aún no especifican una "plataforma" como dependencia de paquetes. Acabo de instalar "Ninject" y hace referencia a la versión .NET 4.0 en una subcarpeta "paquetes". Supongo que fue una mejor suposición ya que mi proyecto está en 4.0, pero eso es bastante peligroso de suponer. Tampoco entiendo qué plataforma será seleccionada por la dependencia de los paquetes.

La función "Restaurar paquete" transforma mi solución agregando un paso de precompilación personalizado. No me gusta que algo modifique mis archivos de solución, pero eso no es un problema. No entiendo con qué frecuencia comprueba las nuevas versiones (me gustaría establecer una frecuencia para que los repositorios privados sean bastante frecuentes).

Puedo estar completamente equivocado aquí, sin embargo, parece que Nuget no actualiza automáticamente la dependencia del proyecto cuando se actualiza una versión del paquete. Restaurar paquete creará una nueva subcarpeta para una nueva versión del paquete, sin embargo, tengo que elegir manualmente esa carpeta de Visual Studio eliminando la referencia de antemano.

Algunos paquetes (como jQuery) ejecutarán un script de PowerShell incorporado al inicio. Realmente no me gusta ninguna ejecución personalizada y dependencia de PS que no siempre está presente en Windows y que falta totalmente en las compilaciones Mono que no son de Windows. Por cierto, como mencioné anteriormente a MSBuild, incluso esta dependencia puede no ser realista para satisfacer algunas compilaciones de C ++ (de lo contrario, ¿perderé la función Restaurar paquete?).

El último puede no ser tan importante, sin embargo, lleva bastante tiempo restaurar las dependencias cuando tengo bastantes.

Ivan G.
fuente
0

NuGet sigue siendo la mejor opción en este momento.

El principal problema con NuGet como administrador de dependencias es que fue concebido para ser un administrador de dependencias de "tiempo de desarrollo", no un administrador de dependencias de "tiempo de construcción".

Un desarrollador restauraría un paquete NuGet a través de Visual Studio ... y esto podría ejecutar un script de PowerShell durante la restauración que modifica los archivos en el proyecto.

Esto es diferente a otros sistemas de administración de dependencias que he visto, ya que agregar una dependencia y resolverla puede alterar el sistema que hace referencia a la dependencia.

No hay un mecanismo integrado para garantizar o verificar la idempotencia en el script de PowerShell, por lo que ejecutarlo más de una vez en el mismo conjunto de archivos puede no ser determinista.

Parece que muchos usan NuGet para extraer paquetes a través de Visual Studio durante el tiempo de desarrollo, pero no estoy al tanto de una recomendación sólida sobre cómo se supone que funciona en un servidor de compilación.

DonBecker
fuente