每当安装、更新或还原包时,NuGet 会在项目结构之外的多个文件夹中管理包和包信息:
| Name | 位置 |
|---|---|
| global-packages |
|
| http-cache |
|
| 临时 | %temp%\NuGetScratch/tmp/NuGetScratch/tmp/NuGetScratch<username> |
| plugins-cache4.8+ |
|
注释
NuGet 3.5 及更早版本使用包缓存而不是位于的 %localappdata%\NuGet\Cache。
通过使用缓存和 全局包 文件夹,NuGet 通常会避免下载计算机上已存在的包,从而提高安装、更新和还原作的性能。 使用 PackageReference 时, 全局包 文件夹也会避免将下载的包保留在项目文件夹中,其中可能会无意中将其添加到源代码管理中,并减少 NuGet 对计算机存储的总体影响。
当系统要求检索包时,NuGet 首先在 全局包 文件夹中查找。 如果包的确切版本不存在,则 NuGet 会检查所有非 HTTP 包源。 如果未找到包,NuGet 将在 http 缓存中查找包,除非使用命令或--no-http-cachedotnet.exe命令指定-NoHttpCachenuget.exe。 如果包不在缓存中,或者未使用缓存,则 NuGet 会通过 HTTP 检索包。
有关详细信息,请参阅安装包时会发生什么情况?
全局包
全局包文件夹是 NuGet 安装任何下载的包的位置。
每个包完全扩展为与包标识符和版本号匹配的子文件夹。
使用 PackageReference 格式的项目始终直接从此文件夹中使用包。
使用 packages.config时,包将安装到 全局包 文件夹中,然后将其复制到项目的 packages 文件夹中。
清理全局包目录
需要手动清理全局包目录,以删除不再使用的包。
可以使用 dotnet nuget locals global-packages --clean 命令,或在 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 是 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 分钟的文件通常被视为过期。
临时
NuGet 可在其各种操作期间存储临时文件的文件夹。
插件缓存
用于存储操作声明请求结果的 NuGet 文件夹。 有关详细信息,请参阅 跨平台插件参考 。
查看文件夹位置
可以使用 nuget 局部变量命令查看位置:
# Display locals for all folders: global-packages, http cache, temp and plugins cache
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
(package-cache 在 NuGet 2.x 中使用,并随 NuGet 3.5 及更早版本一起显示)。
还可以使用 dotnet nuget 局部变量命令查看文件夹位置:
dotnet nuget locals all --list
典型输出 (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 --clear 选项(dotnet.exe)或 locals -clear 选项(nuget.exe)指明要清除的文件夹,或者使用 all 来清除所有文件夹:
# Clear the 3.x+ cache (use either command)
dotnet nuget locals http-cache --clear
nuget locals http-cache -clear
# Clear the 2.x cache (NuGet CLI 3.5 and earlier only)
nuget locals packages-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
Visual Studio 支持清除“NuGet 包管理器”选项中的所有本地文件夹,这些文件夹位于“ 工具 > NuGet 包管理器 > 包管理器设置” 菜单命令下。
在“常规”页上,选择“ 清除 NuGet 本地资源”。 启动后,此操作无法被取消。 将显示进度栏,并包含命令的最终状态。
选择“包管理器”的“显示输出”时,输出 窗口 将显示有关清除命令的其他详细信息,包括任何错误消息。
清除 NuGet 本地资源
目前无法通过包管理器控制台管理缓存。
有关详细信息,请参阅 Visual Studio 中的 NuGet 选项。
排查错误
以下错误可能发生在使用 nuget locals 或 dotnet nuget locals 时:
错误:进程无法访问文件<包,因为另一进程正在使用该文件包>或清除本地资源失败:无法删除一个或多个文件
文件夹中的一个或多个文件由另一个进程使用;例如,Visual Studio 项目处于打开状态,引用 全局包 文件夹中的包。 关闭这些进程,然后重试。
错误:拒绝访问路径<路径>或目录不为空
你无权删除缓存中的文件。 如果可能,请更改文件夹权限,然后重试。 否则,请与系统管理员联系。
错误:指定的路径、文件名或两者都太长。 完全限定的文件名必须小于 260 个字符,目录名称必须小于 248 个字符。
缩短文件夹名称,然后重试。