每当安装、更新或还原包时,NuGet 会在项目结构之外的多个文件夹中管理包和包信息:
| Name | 位置 |
|---|---|
| global-packages |
|
| http-cache |
|
| 临时 | %temp%\NuGetScratch/tmp/NuGetScratch/tmp/NuGetScratch<username> |
| plugins-cache4.8+ |
|
通过使用 全局包 文件夹,NuGet 通常会避免下载计算机上已存在的包,从而提高安装、更新和还原作的性能。 使用 PackageReference 时, 全局包 文件夹也会避免将下载的包保留在项目文件夹中,其中可能会无意中将其添加到源代码管理中,并减少 NuGet 对计算机存储的总体影响。
当系统要求检索包时,NuGet 首先在 全局包 文件夹中查找。
如果包的确切版本不存在,则 NuGet 会检查所有非 HTTP 包源。
如果未找到包,NuGet 将在 http 缓存中查找包,除非使用命令或--no-http-cachedotnet.exe命令指定-NoHttpCachenuget.exe。
如果包不在 HTTP 缓存中,或者未使用 HTTP 缓存,则 NuGet 会通过 HTTP 检索包。
有关详细信息,请参阅安装包时会发生什么情况?
全局包
全局包文件夹是 NuGet 安装任何下载的包的位置。
每个包完全扩展为与包标识符和版本号匹配的子文件夹。
使用 PackageReference 格式的项目始终直接从此文件夹中使用包。
使用 packages.config时,包将安装到 全局包 文件夹中,然后将其复制到项目的 packages 文件夹中。
清理全局包目录
需要手动清理全局包目录,以删除不再使用的包。
可以使用 dotnet nuget locals global-packages --clear 命令,或在 Visual Studio 的选项中使用“清除 NuGet 本地资源”按钮(等效于 dotnet nuget locals all --clear)来执行此操作。
清除全局包目录后,需要再次还原项目以重新加载所有必需的包。
在 Visual Studio 中,可能需要重新加载解决方案以清除 NuGet 的“最新还原”缓存,或者执行命令行还原(例如,在 Visual Studio 的终端窗口中)使用 msbuild -t:restore your.sln。
若要仅清理未使用的包,需要执行两个步骤。
首先,应启用 nuget.config 设置 updatePackageLastAccessTime 。
此设置会导致 NuGet 在还原每个包时,更新其 .nupkg.metadata 文件。
执行还原时,如果项目被视为已是最新状态,包的时间戳将不会更新。因此,如果几周内项目的还原输入没有变化,.nupkg.metadata 文件的时间戳也将不会更新。
该文件 .nupkg.metadata 是 NuGet 在还原或安装期间下载和提取包时将创建的最后一个文件,并且是用于检查包是否已成功提取的文件。
其次,运行一个工具来执行清理。
updatePackageLastAccessTime启用设置后,建议等待几天,以确保你使用的所有包定期更新其时间戳。
目前,NuGet 不提供用于执行此作的工具或命令。 可以 添加 👍 对此 GitHub 问题的反应 ,以表明你的兴趣。 一些社区成员创建了自己的开源 NuGet 清理器工具,你可以搜索这些工具。
如果要编写自己的清理工具,必须确保在删除任何其他包文件时同时删除 .nupkg.metadata 文件,因此我们建议优先删除此文件。
否则,引用该包的项目可能会出现意外行为。
如果在 .NET 中编写清理工具,请考虑使用 ConcurrencyUtilities.ExecuteWithFileLocked[Async](..)NuGet.Common 包,传递要删除的包目录的完整 nupkg 路径作为密钥,以避免同时删除还原尝试提取的包。
可以使用 NuGet.Configuration 包以编程方式找到全局包目录。
使用Settings.LoadDefaultSettings(path)来获取ISettings实例(您可以传递null作为路径,或者如果您想处理具有重定向全局包目录的 nuget.config 的解决方案,可以传递一个目录),然后使用SettingsUtility.GetGlobalPackagesFolder(settings)。
或者,可以作为子进程运行 dotnet nuget locals global-packages --list 并分析输出。
HTTP缓存
NuGet 将缓存大多数 NuGet 源通信(不包括搜索)的副本,这些副本将组织到每个包源的子文件夹中。 包不会展开,并且上次修改日期超过 30 分钟的文件通常被视为过期。
PackageReference 在还原时将缓存源中包含的版本列表。 因此,如果发布了一个新版本的包,并且您希望在 30 分钟的缓存过期时间之前更快地使用它,您可以清除 HTTP 缓存,以强制恢复并更快地检查是否有更新的版本。
临时
NuGet 可在其各种操作期间存储临时文件的文件夹。
如果同时执行多个 NuGet 操作,例如一台计算机上运行多个 CI 代理,所有进程共享同一临时目录 NuGetScratch 是非常重要的。
NuGet 使用临时目录通过文件系统锁协调对 http-cache 和 global-packages 目录的进程间访问。
如果不同的进程使用不同的临时目录,但相同的全局包或 http 缓存目录,则尝试还原或安装包时可能会发生各种错误。
NuGet 不使用文件系统锁定来协调还原项目,因此尝试同时还原同一个项目的两个不同的进程可能会遇到问题,即使使用相同的 NuGetScratch 目录也是如此。
插件缓存
用于存储操作声明请求结果的 NuGet 文件夹。 有关详细信息,请参阅 跨平台插件参考 。
查看文件夹位置
可以使用 dotnet nuget 局部变量命令查看目录位置:
dotnet nuget locals all --list
典型输出 (Windows;“user1”是当前用户名:
http-cache: C:\Users\user1\AppData\Local\NuGet\v3-cache
global-packages: C:\Users\user1\.nuget\packages\
temp: C:\Users\user1\AppData\Local\Temp\NuGetScratch
plugins-cache: C:\Users\user1\AppData\Local\NuGet\plugins-cache
典型输出 (Mac;“user1”是当前用户名:
info : http-cache: /home/user1/.local/share/NuGet/v3-cache
info : global-packages: /home/user1/.nuget/packages/
info : temp: /tmp/NuGetScratch
info : plugins-cache: /home/user1/.local/share/NuGet/plugins-cache
典型输出 (Linux;“user1”是当前用户名:
info : http-cache: /home/user1/.local/share/NuGet/v3-cache
info : global-packages: /home/user1/.nuget/packages/
info : temp: /tmp/NuGetScratchuser1
info : plugins-cache: /home/user1/.local/share/NuGet/plugins-cache
若要显示单个文件夹的位置,请使用http-cache、global-packages或tempplugins-cache代替all。
还可以使用 locals 命令查看 NuGet.exe 的位置:
# Display locals for all directories: global-packages, http-cache, temp and plugins-cache
nuget locals all -list
清除本地文件夹
命令行
如果您遇到包安装问题,或者只是希望确保从远程库安装包,请使用 locals --clear 选项(dotnet.exe)或 locals -clear 选项(nuget.exe)指明要清除的文件夹,或者使用 all 来清除所有文件夹:
# Clear the HTTP cache (use either command)
dotnet nuget locals http-cache --clear
nuget locals http-cache -clear
# Clear the global packages folder (use either command)
dotnet nuget locals global-packages --clear
nuget locals global-packages -clear
# Clear the temporary cache (use either command)
dotnet nuget locals temp --clear
nuget locals temp -clear
# Clear the plugins cache (use either command)
dotnet nuget locals plugins-cache --clear
nuget locals plugins-cache -clear
# Clear all caches (use either command)
dotnet nuget locals all --clear
nuget locals all -clear
Visual Studio
Visual Studio 支持清除“NuGet 包管理器”选项中的所有本地文件夹,这些文件夹位于“ 工具 > NuGet 包管理器 > 包管理器设置” 菜单命令下。
在“常规”页上,选择“ 清除 NuGet 本地资源”。 启动后,此操作无法被取消。 将显示进度栏,并包含命令的最终状态。
选择“包管理器”的“显示输出”时,输出 窗口 将显示有关清除命令的其他详细信息,包括任何错误消息。
有关详细信息,请参阅 Visual Studio 中的 NuGet 选项。
排查错误
以下错误可能发生在使用 nuget locals 或 dotnet nuget locals 时:
错误:进程无法访问文件<包,因为另一进程正在使用该文件包>或清除本地资源失败:无法删除一个或多个文件
文件夹中的一个或多个文件由另一个进程使用;例如,Visual Studio 项目处于打开状态,引用 全局包 文件夹中的包。 关闭这些进程,然后重试。
错误:拒绝访问路径<路径>或目录不为空
你无权删除缓存中的文件。 如果可能,请更改文件夹权限,然后重试。 否则,请与系统管理员联系。
错误:指定的路径、文件名或两者都太长。 完全限定的文件名必须小于 260 个字符,目录名称必须小于 248 个字符。
缩短文件夹名称,然后重试。