NuGet如何决定是否使用本地包缓存?

Yan*_*nko 13 versioning nuget nuget-package

今天我在安装软件包时遇到了NuGet的奇怪行为.

简要说明:作为我的构建脚本的结果,有一个NuGet包.我不会每次都更改版本,因此每个版本都会生成MyPackage.1.0.0.nupkg.作为构建的最后一步,我将包推送到本地网络内部署的NuGet服务器.

现在,在另一台机器上,我运行nuget install MyPackage -Source http://myserver/nuget,显然安装了NuGet包.

当我推送另一个更新MyPackage- 仍然是版本时,问题开始发挥作用1.0.0.当我尝试在客户端计算机上重新安装它时,我得到了以前版本的软件包.

我发现它是被指责的本地缓存:如果软件包已安装,它将进入本地缓存,下次安装相同版本的软件包,它将从缓存中获取.很公平!

但是,另一方面,有一个命令-NoCache选项nuget install,我希望它忽略本地缓存.

但是,事实并非如此.我第一次运行它时-NoCache,它会更新缓存并安装真正的最新版本.但是,下次仍然从缓存中获取包,即使有-NoCache选项.

这是预期的吗?是因为版本没有改变?

以防万一:所有NuGet操作都是通过NuGet.exePowerShell会话完成的.

更新:我观察到奇怪的行为我只能通过缓存过期来解释.缓存包时,所有后续调用都会nuget install从缓存中提取包,直到一段时间过去.我没注意到确切的时间段,但肯定超过一个小时.在此之后,nuget install更新缓存中的包,情况变得相同......

Jua*_*gui 12

严,

NuGet将其下载的软件包缓存在本地硬盘上.对于我的Windows 7机器,缓存位于C:\ Users\jmelosegui\AppData\Local\NuGet\Cache.因此,您可以从本地缓存目录中删除要忘记的nuget包.然后,下次安装软件包时,您将从服务器获得最新版本.

顺便说一句:我同意@ matthew-skelton.

您不应该使用特定版本推送多个包:包应该是不可变的.如果您更改了包中的内容,请增加内部版本号abC并推送新版本的包.

我希望这种方法适合你的场景

  • 感谢您的回答!这是我暂时做的事情 - 清理NuGet缓存"脏"的方式.但我认为我应该研究包装不变性的概念...... (2认同)

Mat*_*ton 10

严,

我推送另一个MyPackage更新 - 仍然是版本1.0.0.

您不应该使用特定版本推送多个包:包应该是不可变的.如果您更改了包中的内容,请增加内部版本号a.b.C并推送新版本的包.

您遇到的行为是NuGet期望能够无限期地缓存给定包版本的副作用.

  • 我建议使用[语义版本控制](http://semver.org),特别是它的预发布命名法(例如:`MyPackage.1.0.0-alpha1440.nupkg`或其他东西).这样做的一个好处(除了作为行业标准)是包装饲料(例如nuget.org)理解这一点并相应地标记它.参见[Antlr示例](http://www.nuget.org/packages/Antlr/3.4.1.9004-pre). (5认同)
  • 感谢您的回答!我不更改版本的原因是因为该软件包仍在开发中,并且每天重建 10 - 20 次。当我最初“发布”该包时,我仍然希望它是 1.0.0。在这种情况下你有什么建议?使用 0.xx 表示法和/或 NuGet 的预发布工具? (2认同)