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

14

今天我遇到了一个奇怪的NuGet安装包行为。

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

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

问题出现在当我推送另一个版本为1.0.0MyPackage更新时。当我试图在客户端机器上重新安装它时,我得到的是先前版本的包。

我发现这是本地缓存的问题:如果已安装了该包,则会进入本地缓存,下一次安装相同版本的包时,它将从缓存中获取。很公平!

另一方面,nuget install 命令有一个 -NoCache 选项,我期望它会忽略本地缓存。

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

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

以防万一:所有 NuGet 操作都是使用 NuGet.exe 和 PowerShell 会话完成的。

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


也许如果您包括 -verbosity detailed,额外的日志可能会给我们一些提示? - allen
如果我在命令行中添加“-verbosity detailed”,它不会输出更多信息,只会输出“成功安装'MyPackage.1.0.0'”。你知道为什么吗? - Yan Sklyarenko
1
我希望日志能够显示一些方向。 - allen
为了跟踪 - @Deepak 在NuGet项目中注册了一个问题:http://nuget.codeplex.com/workitem/3021 - Yan Sklyarenko
2个回答

12

Yan,

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

顺便说一下:我同意@matthew-skelton的观点。

您不应该推送具有特定版本的多个软件包:软件包应该是不可变的。如果您更改了软件包中的内容,则应将构建号a.b.C增加并推送软件包的新版本。

我希望这种方法适用于您的情况。


2
谢谢你的回答!这是我暂时采取的方法——以“肮脏”的方式清理NuGet缓存。但我认为我应该调查一下包不可变性的概念... - Yan Sklyarenko

12

Yan,

我又发布了一个 MyPackage 的更新版本 - 仍然是版本 1.0.0

你不应该多次推送具有特定版本的软件包:软件包应该是不可变的。如果你在软件包中做了更改,请增加构建号 a.b.C 并推送软件包的新版本。

你所遇到的行为是 NuGet 的一个副作用,NuGet 希望能够无限期地缓存给定的软件包版本。


2
谢谢您的回答!我不更改版本的原因是该软件包仍在开发中,每天会重建10-20次。当我最初“发布”软件包时,我仍希望它是1.0.0版本。在这种情况下,您有什么建议?使用0.x.x表示法和/或NuGet的预发布功能? - Yan Sklyarenko
1
嗨Yan,你可以在包的版本号A.B.C.D上递增构建号。这样可以保留1.0.0.x,其中x可能是构建73。预发布是另一个选项,但语义仍然在NuGet中非常不稳定,因此您可能会在不同版本的NuGet之间获得意外结果;我建议现在使用“D”构建号。 - Matthew Skelton
9
我建议使用语义化版本控制,特别是它的预发布命名规则(例如:MyPackage.1.0.0-alpha1440.nupkg)。这样做的好处之一(除了它是行业标准)是包管理器(如nuget.org)可以理解并相应地标注。可以参考这个Antlr示例 - mo.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接