2013-02-04 19 views
12

今天我在安裝軟件包時遇到了一個奇怪的NuGet行爲。NuGet如何決定是否使用本地包緩存?

簡要說明:由於我的構建腳本中有一個NuGet包。我不會每次更改版本,因此每個版本都會生成MyPackage.1.0.0.nupkg。作爲構建的最後一步,我將包推送到本地網絡內部署的NuGet服務器。

現在,在另一臺機器上,我運行了nuget install MyPackage -Source http://myserver/nuget,顯然它安裝了NuGet軟件包。

當我推動MyPackage的另一個更新 - 仍然是1.0.0版本時,問題就會發揮作用。當我嘗試在客戶端機器上重新安裝它時,我得到了該軟件包的以前版本。

我發現it is the local cache to be blamed:如果安裝了軟件包,它進入本地緩存和相同版本的包安裝接下來的時間,它是從緩存中獲取。很公平!

但另一方面,nuget install命令的-NoCache選項,我希望它忽略本地緩存。

但是,這是不正確的。我第一次運行它-NoCache,它更新緩存並安裝真正的最新版本。但是,下次包仍然從緩存中取出時,即使使用-NoCache選項。

是否預計?是否因爲版本沒有更改?

以防萬一:所有NuGet操作都使用NuGet.exe和PowerShell會話完成。

UPDATE:我觀察到奇怪的行爲,我只能通過緩存過期來解釋。當緩存包時,所有後續調用nuget install將從高速緩存中取出該包,直到經過一段時間。我沒有注意到確切的時間,但絕對不止一個小時。在此之後,nuget install更新緩存中的包,情況就變得一樣的...

+0

也許如果包括-verbosity詳述的其他日誌可以給我們一些提示? – allen

+0

如果我在命令行追加'-verbosity詳細信息',它不會輸出更多的信息,只是'成功安裝'MyPackage.1.0.0''你知道它爲什麼如此嗎? –

+0

我希望日誌顯示出一些方向 – allen

回答

10

顏,

我推MyPackage的另一個更新 - 仍然1.0.0版本。

您不應該推出一個包含特定版本的多個包:包應該是不可變的。如果您更改了軟件包中的某些內容,請增加內部版本號a.b.C並推送新版本的軟件包。

您遇到的行爲是NuGet希望能夠基本上無限期地緩存給定包版本的副作用。

+1

感謝您的回答!我不更改版本的原因是因爲該軟件包仍在開發中,並且每天重建10到20次。當我最初「釋放」軟件包時,我仍然希望它是1.0.0。你在這種情況下建議什麼?使用NuGet的0.x.x符號和/或預發佈設施? –

+1

嗨妍,你可以增加包裝上的內部編號'D':ABCD 這允許你保留1.0.0.x,其中x可能構建73. 預發佈是另一種選擇,但語義是NuGet仍然非常流行,所以你可能會在不同版本的NuGet之間獲得意想不到的結果;我建議現在使用'D'內部編號。 –

+3

我建議使用[語義版本控制](http://semver.org),特別是其預發佈命名法(例如:'MyPackage.1.0.0-alpha1440.nupkg'或其他)。這一點(除了作爲行業標準外)的一個好處是,包飼料(例如nuget.org)瞭解這一點並相應地標記它。看到這個[antlr示例](http://www.nuget.org/packages/Antlr/3.4.1.9004-pre)。 –

12

顏,

的NuGet緩存它下載到本地硬盤驅動器上的包。對於我的Windows 7機器,緩存位於C:\ Users \ jmelosegui \ AppData \ Local \ NuGet \ Cache。 因此,您可以從本地緩存目錄中刪除想要忘記的nuget包。然後,下次安裝軟件包時,您將從服務器獲取最新版本。

BTW:我同意@ matthew-skelton。

你不應該推出一個包含特定版本的軟件包:軟件包應該是不可變的。如果您更改了包中的某些內容,請增加內部版本號a.b.C並推送新版本的包。

我希望這個形式給出適合你的情況

+2

感謝您的回答!這就是我暫時做的 - 以「髒」的方式清理NuGet緩存。但我認爲我應該研究包裹不變性的概念...... –

相關問題