2013-02-04 22 views
12

Hôm nay tôi đã phải đối mặt với một hành vi kỳ lạ của NuGet khi cài đặt một gói.NuGet quyết định có nên sử dụng bộ đệm gói cục bộ hay không?

Mô tả ngắn gọn: do kịch bản xây dựng của tôi có gói NuGet. Tôi không thay đổi phiên bản mỗi lần, vì vậy mỗi bản dựng đều tạo ra MyPackage.1.0.0.nupkg. Là bước cuối cùng của quá trình xây dựng, tôi đẩy gói đến máy chủ NuGet được triển khai bên trong mạng cục bộ.

Bây giờ, trên một máy khác, tôi chạy nuget install MyPackage -Source http://myserver/nuget, rõ ràng là cài đặt gói NuGet.

Sự cố xảy ra khi tôi đẩy một bản cập nhật khác của MyPackage - vẫn là phiên bản 1.0.0. Khi tôi cố gắng cài đặt lại nó trên máy khách, tôi nhận được phiên bản trước của gói.

tôi phát hiện ra it is the local cache to be blamed: nếu gói đã được cài đặt, nó được vào bộ nhớ cache cục bộ và thời gian tiếp theo gói của cùng một phiên bản được cài đặt, nó được lấy từ bộ nhớ cache. Đủ công bằng!

Nhưng, mặt khác, có một tùy chọn -NoCache của lệnh nuget install và tôi hy vọng nó sẽ bỏ qua bộ đệm cục bộ.

Tuy nhiên, điều này không đúng. Lần đầu tiên tôi chạy nó với -NoCache, nó cập nhật bộ nhớ cache và cài đặt phiên bản mới nhất. Tuy nhiên, lần sau gói vẫn được lấy từ bộ nhớ cache, ngay cả với tùy chọn -NoCache.

Dự kiến ​​phải không? Có phải vì phiên bản không bị thay đổi?

Chỉ trong trường hợp: tất cả các thao tác NuGet được thực hiện với NuGet.exe và từ phiên PowerShell.

CẬP NHẬT: Tôi quan sát hành vi lạ tôi chỉ có thể giải thích bằng bộ nhớ cache hết hạn. Khi gói được lưu trong bộ nhớ cache, tất cả các cuộc gọi tiếp theo đến nuget install sẽ kéo gói từ bộ nhớ cache, cho đến khi một thời gian trôi qua. Tôi đã không nhận thấy thời gian chính xác, nhưng nó chắc chắn hơn một giờ. Sau này, nuget install cập nhật các gói trong bộ nhớ cache, và tình hình trở nên giống nhau ...

+0

Có lẽ nếu bạn bao gồm -verbosity chi tiết thêm các bản ghi có thể cung cấp cho chúng tôi một số gợi ý? – allen

+0

Nếu tôi nối 'chi tiết độ chi tiết' vào dòng lệnh, nó không xuất thêm thông tin, chỉ cần' Cài đặt thành công 'MyPackage.1.0.0'' Bạn có biết tại sao lại như vậy? –

+0

Tôi đã hy vọng nhật ký cho thấy một số hướng – allen

Trả lời

10

Yan,

Tôi đẩy một bản update của mypackage - vẫn của phiên bản 1.0.0.

Bạn không được đẩy nhiều hơn một gói với một phiên bản cụ thể: gói phải không thay đổi. Nếu bạn đã thay đổi thứ gì đó trong gói, hãy tăng số bản dựng a.b.C và đẩy phiên bản mới của gói.

Hành vi mà bạn trải nghiệm là một tác dụng phụ của NuGet mong đợi để có thể lưu trữ một phiên bản gói nhất định về cơ bản vô thời hạn.

+1

Cảm ơn câu trả lời của bạn! Lý do tôi không thay đổi phiên bản là vì gói vẫn đang được phát triển và được xây dựng lại 10 - 20 lần mỗi ngày. Khi tôi "phát hành" gói ban đầu, tôi vẫn muốn nó là 1.0.0. Bạn đề nghị gì trong trường hợp này? Sử dụng ký hiệu 0.x.x và/hoặc các tiện ích tiền phát hành của NuGet? –

+1

Hi Yan, bạn có thể tăng số bản dựng 'D' lên gói: ABCD Điều này cho phép bạn giữ lại phiên bản 1.0.0.x trong đó x có thể xây dựng 73. Bản phát hành trước là một tùy chọn khác, nhưng ngữ nghĩa vẫn còn rất nhiều thông lượng với NuGet, vì vậy bạn có thể nhận được kết quả bất ngờ giữa các phiên bản NuGet khác nhau; Tôi khuyên bạn nên sử dụng số xây dựng 'D' thay cho bây giờ. –

+3

Tôi khuyên bạn nên sử dụng [phiên bản ngữ nghĩa] (http://semver.org), đặc biệt là danh mục tiền phát hành của nó (ví dụ: 'MyPackage.1.0.0-alpha1440.nupkg' hoặc một cái gì đó). Một lợi ích của việc này (ngoài tiêu chuẩn công nghiệp) là nguồn cấp dữ liệu của gói (chẳng hạn như nuget.org) hiểu điều này và gắn cờ cho phù hợp. Xem [ví dụ Antlr] (http://www.nuget.org/packages/Antlr/3.4.1.9004-pre). –

12

Yan,

NuGet lưu trữ các gói tải xuống trên ổ cứng cục bộ của bạn. Đối với cửa sổ của tôi 7 máy bộ nhớ cache được đặt tại C: \ Users \ jmelosegui \ AppData \ Local \ NuGet \ Cache. Vì vậy, bạn có thể xóa gói nuget mà bạn muốn quên khỏi thư mục bộ nhớ cache cục bộ. Sau đó, lần sau khi bạn cài đặt gói, bạn sẽ nhận được phiên bản mới nhất từ ​​máy chủ.

BTW: Tôi đồng ý với @ matthew-skelton.

Bạn không được đẩy nhiều hơn một gói với một phiên bản cụ thể: gói phải không thay đổi. Nếu bạn đã thay đổi thứ gì đó trong gói, hãy tăng số bản dựng a.b.C và đẩy phiên bản mới của gói.

Tôi hy vọng aproach phù hợp này trong kịch bản của bạn

+2

Cảm ơn câu trả lời của bạn! Đây là những gì tôi tạm thời kết thúc - làm sạch bộ đệm NuGet theo cách "bẩn". Nhưng tôi nghĩ tôi nên điều tra khái niệm về sự bất biến của gói ... –