Làm cách nào để chỉ định phiên bản phụ thuộc cụ thể trong nuspec?


81

Tôi đang tạo gói nuget đầu tiên của mình. Tôi đã thêm phần phụ thuộc với một phiên bản không phải là phiên bản mới nhất. Tuy nhiên, tôi không muốn cập nhật lên phiên bản mới nhất của phụ thuộc này. Có thể hướng dẫn nó sử dụng phiên bản cụ thể không?

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

Khi tôi cài đặt gói, tôi thấy điều này:

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

Điều này tạo ra phần sau khi tôi cài đặt gói.

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

Tôi thực sự muốn thấy một cái gì đó như thế này: Đang cố gắng giải quyết sự phụ thuộc 'NHibernate (3.2.0.3001)'.


5
Bạn có thể làm điều này như được trả lời dưới đây. Nhưng hãy nhớ rằng bất kỳ ai sử dụng gói của bạn và cũng sử dụng NHibernate, (hoặc bất kỳ phụ thuộc nào khác mà bạn đã chỉ định phiên bản gói chính xác) thì không thể cập nhật điều này vì bất kỳ lý do gì trừ khi bạn cho phép họ. Đây là một trạng thái tồi tệ. Gần đây, một "phiên bản bị khóa" đã khiến chúng tôi khó chịu: Trong trường hợp của chúng tôi, gói bị khóa phiên bản không phải là NHib mà là một gói không liên quan. Khóa phiên bản có thể cần thiết nếu có những thay đổi thực sự có hại trong thư viện ngược dòng, nhưng trong trường hợp của chúng tôi mà chúng tôi đã không có; chỉ lạm dụng cú pháp này. Vì vậy, nếu bạn sử dụng nó, hãy sử dụng nó một cách thận trọng!
Anthony

Câu trả lời:


129

Bạn sẽ có thể buộc một phiên bản chính xác có dấu ngoặc:

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

Thông tin đầy đủ về các định dạng bạn có thể sử dụng có trên trang NuGet, tại đây:

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


Tôi không biết làm thế nào tôi không tìm thấy trang đó! Cảm ơn.
devlife

1
Bạn có thể làm được việc này. Nhưng hãy nhớ rằng bất kỳ ai sử dụng gói của bạn và cũng sử dụng NHibernate thì không thể cập nhật NHibernate vì bất kỳ lý do gì trừ khi bạn cho phép họ. Đây không phải là một trạng thái tuyệt vời.
Anthony

2
@Anthony Tôi nghĩ nhận xét này tốt hơn cho câu hỏi mà câu trả lời của tôi; Tôi chỉ bày cách làm, không bênh vực. Tuy nhiên, vấn đề bạn mô tả không dễ giải quyết; Nếu bạn có hai đoạn mã không hoạt động cùng một phiên bản NH (vì lỗi, sự khác biệt về API, bất cứ điều gì), thì bạn đã bị hỏng rồi. Việc sửa chữa thực sự là phụ thuộc tư nhân (như Node có), nhưng tôi không thể nhìn thấy NET bao giờ nhận được sự ủng hộ "thích hợp" cho điều đó :(
Danny Tuppeny

1
Vâng, tôi đồng ý và sẽ đính kèm lại bình luận. Nói rõ hơn, một "phiên bản bị khóa" đã cắn chúng tôi gần đây nên nó mới xuất hiện trong tâm trí tôi. Trong trường hợp của chúng tôi, gói bị khóa phiên bản không phải là NHib mà là một gói hoàn toàn không liên quan. Khóa phiên bản có thể là cần thiết nếu có những thay đổi thực sự trong thư viện, nhưng trong trường hợp của chúng tôi mà chúng tôi đã không có thì không; chỉ lạm dụng cú pháp này. Vì vậy, sử dụng nó một cách thận trọng!
Anthony



2

Theo http://nuget.codeplex.com/wikipage?title=Dependency%20Resolution và các nguồn khác, chỉ cần chỉ định giới hạn dưới là

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

sẽ dẫn đến mức sửa đổi / bản vá cao nhất của phiên bản chính / phụ thấp nhất phù hợp với phiên bản đó.

Trừ khi tôi hoàn toàn hiểu nhầm tài liệu, điều này sẽ khớp với phiên bản 3.2. * Cao nhất chứ không phải phiên bản 3.3. * Hoặc cao hơn trừ khi không tìm thấy phiên bản 3.2. * Nào.

Nếu có lý do nào đó khiến 3.2.0.3001 là phiên bản duy nhất mà bạn muốn dựa vào, bạn có thể thấy rằng gói của mình không tương thích với các gói khác cũng phụ thuộc vào NHibernate chẳng hạn vì gói khác phụ thuộc vào NHibernate [3.2.0.3002 , 3.3) có nghĩa là ít nhất 3.2.0.3002 nhưng thấp hơn 3.3.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.