¿Cómo especificar la versión de dependencia específica en nuspec?

81

Estoy creando mi primer paquete nuget. Agregué una dependencia con una versión que no es la última versión. Sin embargo, no quiero actualizar a la última versión de esta dependencia. ¿Es posible indicarle que use la versión específica?

<dependencies>
  <dependency id="NHibernate" version="3.2.0.3001" />
</dependencies>

Cuando instalo el paquete, veo esto:

Attempting to resolve dependency 'NHibernate (≥ 3.2.0.3001)'.

Esto crea lo siguiente cuando instalo el paquete.

<packages>
  <package id="Iesi.Collections" version="3.2.0.4000" />
  <package id="NHibernate" version="3.2.0.4000" />
</packages>

Realmente me gustaría ver algo como esto: Intentar resolver la dependencia 'NHibernate (3.2.0.3001)'.

devlife
fuente
5
Puede hacer esto como se responde a continuación. Pero tenga en cuenta que cualquiera que use su paquete y también use NHibernate, (o cualquier otra dependencia en la que haya especificado la versión exacta del paquete) no puede actualizar esto por ningún motivo a menos que usted lo permita. Este es un mal estado de cosas. Una "versión bloqueada" nos mordió recientemente: en nuestro caso, el paquete de versión bloqueada no era NHib sino un paquete no relacionado. La versión de bloqueo puede ser necesaria si hay cambios genuinos en una biblioteca anterior, pero en nuestro caso, no los hubo; simplemente uso excesivo de esta sintaxis. Entonces, si lo usa, ¡utilícelo con precaución!
Anthony

Respuestas:

129

Debería poder forzar una versión exacta con corchetes:

<dependency id="NHibernate" version="[3.2.0.3001]" />

La información completa sobre los formatos que puede usar se encuentra en el sitio de NuGet, aquí:

http://docs.nuget.org/docs/reference/version-range-specification

Danny Tuppeny
fuente
¡No sé cómo no encontré esa página! Gracias.
devlife
1
Puedes hacerlo. Pero tenga en cuenta que cualquiera que use su paquete y también use NHibernate, no podrá actualizar NHibernate por ningún motivo a menos que usted lo permita. Este no es un gran estado de cosas.
Anthony
2
@Anthony Creo que este comentario es mejor en la pregunta que mi respuesta; Solo estaba mostrando cómo hacerlo, no defendiéndolo. Sin embargo, el problema que describe no se resuelve fácilmente; si tiene dos lotes de código que simplemente no funcionan con la misma versión de NH (debido a errores, diferencias de API, lo que sea), entonces ya está jodido. La solución real son las dependencias privadas (como las que tiene Node), pero no puedo ver que .NET obtenga el soporte "adecuado" para eso :(
Danny Tuppeny
1
Sí, estoy de acuerdo y volveré a adjuntar el comentario. Para ser claros, una "versión bloqueada" nos mordió recientemente, así que está fresca en mi mente. En nuestro caso, el paquete de versión bloqueada no era NHib sino un paquete completamente ajeno. La versión de bloqueo puede ser necesaria si hay cambios genuinos en una biblioteca, pero en nuestro caso, no los hubo; simplemente uso excesivo de esta sintaxis. ¡Úselo con precaución!
Anthony
2

Según http://nuget.codeplex.com/wikipage?title=Dependency%20Resolution y otras fuentes, simplemente especificando el límite inferior como

<dependencies>
  <dependency id="NHibernate" version="3.2.0.3001" />
</dependencies>

dará como resultado el nivel de revisión / parche más alto de la versión principal / menor más baja que coincida con esa versión.

A menos que no entienda completamente la documentación, esto coincidiría con la versión 3.2. * Más alta, pero no con la 3.3. * O versiones superiores, a menos que no se pueda encontrar una versión 3.2. *.

Si hay alguna razón por la que 3.2.0.3001 es la única versión de la que desea depender, puede encontrar que su paquete no es compatible con otros paquetes que también dependen de NHibernate, por ejemplo, porque el otro paquete depende de NHibernate [3.2.0.3002 , 3.3) lo que significa al menos 3.2.0.3002 pero menor que 3.3.

Chris Lee
fuente