Jak określić konkretną wersję zależności w nuspec?

83

Tworzę mój pierwszy pakiet NuGet. Dodałem zależność z wersją, która nie jest najnowszą wersją. Jednak nie chcę aktualizować do najnowszej wersji tej zależności. Czy można polecić mu korzystanie z określonej wersji?

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

Kiedy instaluję pakiet, widzę to:

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

Tworzy to, co następuje, gdy instaluję pakiet.

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

Naprawdę chciałbym zobaczyć coś takiego: Próba rozwiązania zależności „NHibernate (3.2.0.3001)”.

devlife
źródło
5
Możesz to zrobić zgodnie z poniższą odpowiedzią. Ale pamiętaj, że każdy, kto używa twojego pakietu, a także używa NHibernate (lub jakiejkolwiek innej zależności, w której podałeś dokładną wersję pakietu), nie może zaktualizować tego z jakiegokolwiek powodu, chyba że im na to pozwolisz. To jest zły stan rzeczy. Niedawno ugryzła nas „zablokowana wersja”: w naszym przypadku pakietem z zablokowaną wersją nie był NHib, ale pakiet niepowiązany. Wersja blokująca może być konieczna, jeśli w bibliotece nadrzędnej są autentyczne, krytyczne zmiany, ale w naszym przypadku nie było; po prostu nadużywanie tej składni. Więc jeśli go używasz, używaj go ostrożnie!
Anthony

Odpowiedzi:

131

Powinieneś być w stanie wymusić dokładną wersję za pomocą nawiasów:

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

Pełne informacje o formatach, których możesz używać, znajdują się w witrynie NuGet, tutaj:

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

Danny Tuppeny
źródło
Nie wiem, jak nie znalazłem tej strony! Dzięki.
devlife
1
Możesz to zrobić. Ale pamiętaj, że każdy, kto korzysta z Twojego pakietu, a także korzysta z NHibernate, nie może zaktualizować NHibernate z jakiegokolwiek powodu, chyba że mu na to pozwolisz. To nie jest wspaniały stan rzeczy.
Anthony
3
@Anthony Myślę, że ten komentarz jest lepszy do pytania, na które moja odpowiedź; Po prostu pokazałem, jak to zrobić, a nie zalecałem tego. Problem, który opisujesz, nie jest jednak łatwy do rozwiązania; jeśli masz dwie partie kodu, który po prostu nie działa w tej samej wersji NH (z powodu błędów, różnic w API, cokolwiek), to już masz przerąbane. Prawdziwą poprawką są prywatne zależności (takie jak Node), ale nie widzę, aby .NET kiedykolwiek uzyskał "odpowiednią" obsługę tego :(
Danny Tuppeny
1
Tak, zgadzam się i ponownie załączę komentarz. Żeby było jasne, „zablokowana wersja” ugryzła nas ostatnio, więc mam ją świeżo w pamięci. W naszym przypadku pakietem z zablokowaną wersją nie był NHib, ale pakiet zupełnie niepowiązany. Wersja blokująca może być konieczna, jeśli w bibliotece są autentyczne, niszczące zmiany, ale w naszym przypadku nie było; po prostu nadużywanie tej składni. Więc używaj go ostrożnie!
Anthony
2

Według http://nuget.codeplex.com/wikipage?title=Dependency%20Resolution i innych źródeł, po prostu określając dolną granicę jako

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

spowoduje uzyskanie najwyższego poziomu poprawki / poprawki najniższej wersji głównej / pomocniczej pasującej do tej wersji.

O ile całkowicie nie zrozumiem dokumentacji, będzie to pasowało do najwyższej wersji 3.2. *, Ale nie do wersji 3.3. * Lub nowszych, chyba że nie można znaleźć wersji 3.2. *.

Jeśli jest jakiś powód, dla którego 3.2.0.3001 jest jedyną wersją, na której chcesz polegać, może się okazać, że Twój pakiet nie jest kompatybilny z innymi pakietami, które również zależą od NHibernate, na przykład ponieważ inny pakiet zależy od NHibernate [3.2.0.3002 , 3.3), co oznacza co najmniej 3.2.0.3002, ale mniej niż 3.3.

Chris Lee
źródło