Wie kann eine bestimmte Abhängigkeitsversion in nuspec angegeben werden?

81

Ich erstelle mein erstes Nuget-Paket. Ich habe eine Abhängigkeit mit einer Version hinzugefügt, die nicht die neueste Version ist. Ich möchte jedoch nicht auf die neueste Version dieser Abhängigkeit aktualisieren. Ist es möglich, es anzuweisen, die spezifische Version zu verwenden?

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

Wenn ich das Paket installiere, sehe ich Folgendes:

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

Dadurch wird Folgendes erstellt, wenn ich das Paket installiere.

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

Ich würde wirklich gerne so etwas sehen: Versuch, die Abhängigkeit 'NHibernate (3.2.0.3001)' aufzulösen.

Devlife
quelle
5
Sie können dies wie unten beantwortet tun. Beachten Sie jedoch, dass jeder, der Ihr Paket verwendet und auch NHibernate verwendet (oder eine andere Abhängigkeit, in der Sie die genaue Paketversion angegeben haben), diese aus irgendeinem Grund nur aktualisieren kann, wenn Sie dies zulassen. Dies ist ein schlechter Zustand. Eine "gesperrte Version" hat uns kürzlich gebissen: In unserem Fall war das versionierte Paket nicht NHib, sondern ein nicht verwandtes Paket. Eine Sperrversion kann erforderlich sein, wenn in einer Upstream-Bibliothek echte Änderungen vorgenommen wurden, in unserem Fall jedoch nicht. Überbeanspruchung dieser Syntax. Wenn Sie es verwenden, verwenden Sie es mit Vorsicht!
Anthony

Antworten:

129

Sie sollten in der Lage sein, eine genaue Version mit Klammern zu erzwingen:

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

Ausführliche Informationen zu den Formaten, die Sie verwenden können, finden Sie auf der NuGet-Website hier:

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

Danny Tuppeny
quelle
Ich weiß nicht, wie ich diese Seite nicht gefunden habe! Vielen Dank.
Devlife
1
Du kannst das. Beachten Sie jedoch, dass jeder, der Ihr Paket verwendet und auch NHibernate verwendet, NHibernate aus irgendeinem Grund nur aktualisieren kann, wenn Sie dies zulassen. Dies ist kein guter Zustand.
Anthony
2
@Anthony Ich denke, dieser Kommentar ist besser auf die Frage als meine Antwort; Ich habe nur gezeigt, wie es geht, ohne es zu befürworten. Das von Ihnen beschriebene Problem ist jedoch nicht einfach zu lösen. Wenn Sie zwei Lose Code haben, die einfach nicht mit derselben NH-Version funktionieren (aufgrund von Fehlern, API-Unterschieden usw.), sind Sie bereits fertig. Die eigentliche Lösung sind private Abhängigkeiten (wie es Node getan hat), aber ich kann nicht sehen, dass .NET jemals "richtige" Unterstützung dafür bekommt :(
Danny Tuppeny
1
Ja, ich stimme zu und werde den Kommentar erneut anhängen. Um klar zu sein, eine "gesperrte Version" hat uns kürzlich gebissen, also ist es frisch in meinem Kopf. In unserem Fall war das versionierte Paket nicht NHib, sondern ein völlig unabhängiges Paket. Das Sperren der Version kann erforderlich sein, wenn in einer Bibliothek echte Änderungen vorgenommen wurden, in unserem Fall jedoch nicht. Überbeanspruchung dieser Syntax. Verwenden Sie es also mit Vorsicht!
Anthony
23

Auf der NuGet-Dokumentenseite finden Sie die vollständigen Notationen:

Geben Sie hier die Bildbeschreibung ein

Aviram Fireberger
quelle
2

Laut http://nuget.codeplex.com/wikipage?title=Dependency%20Resolution und anderen Quellen geben Sie einfach die Untergrenze als an

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

führt zu der höchsten Revisions- / Patch-Stufe der niedrigsten Haupt- / Nebenversion, die dieser Version entspricht.

Wenn ich die Dokumentation nicht völlig falsch verstehe, würde dies der höchsten Version 3.2. * Entsprechen, jedoch nicht der Version 3.3. * Oder höher, sofern keine Version 3.2. * Gefunden werden konnte.

Wenn es einen Grund gibt, warum 3.2.0.3001 die einzige Version ist, von der Sie abhängen möchten, stellen Sie möglicherweise fest, dass Ihr Paket nicht mit anderen Paketen kompatibel ist, die ebenfalls von NHibernate abhängen, z. B. weil das andere Paket von NHibernate abhängt [3.2.0.3002 , 3.3) was mindestens 3.2.0.3002 bedeutet, aber niedriger als 3.3.

Chris Lee
quelle