管理全局包、缓存和临时文件夹

每当安装、更新或还原包时,NuGet 会在项目结构之外的多个文件夹中管理包和包信息:

Name 位置
global-packages
  • Windows: %userprofile%\.nuget\packages
  • Mac/Linux: ~/.nuget/packages
  • 使用NUGET_PACKAGES环境变量、 globalPackagesFolderrepositoryPath配置设置 (分别使用 PackageReference 和 packages.config)或 RestorePackagesPath MSBuild 属性(仅 MSBuild)替代。 环境变量优先于配置设置。
http-cache
  • Windows: %localappdata%\NuGet\v3-cache
  • Mac/Linux: ~/.local/share/NuGet/v3-cache
  • 使用NUGET_HTTP_CACHE_PATH环境变量替代。
临时
  • Windows: %temp%\NuGetScratch
  • Mac:/tmp/NuGetScratch
  • Linux:/tmp/NuGetScratch<username>
  • 使用NUGET_SCRATCH环境变量替代。
  • plugins-cache4.8+
    • Windows: %localappdata%\NuGet\plugins-cache
    • Mac/Linux: ~/.local/share/NuGet/plugins-cache
    • 使用NUGET_PLUGINS_CACHE_PATH环境变量替代。

    注释

    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-cacheglobal-packagestempplugins-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 本地资源

    在 NuGet 选项的“常规”页中突出显示的“清除 NuGet 本地资源”按钮

    目前无法通过包管理器控制台管理缓存。

    有关详细信息,请参阅 Visual Studio 中的 NuGet 选项

    排查错误

    以下错误可能发生在使用 nuget localsdotnet nuget locals 时:

    • 错误:进程无法访问文件<包,因为另一进程正在使用该文件包>清除本地资源失败:无法删除一个或多个文件

      文件夹中的一个或多个文件由另一个进程使用;例如,Visual Studio 项目处于打开状态,引用 全局包 文件夹中的包。 关闭这些进程,然后重试。

    • 错误:拒绝访问路径<路径>目录不为空

      你无权删除缓存中的文件。 如果可能,请更改文件夹权限,然后重试。 否则,请与系统管理员联系。

    • 错误:指定的路径、文件名或两者都太长。 完全限定的文件名必须小于 260 个字符,目录名称必须小于 248 个字符。

      缩短文件夹名称,然后重试。