安装 NuGet 包时会发生什么情况?

简而言之,各种 NuGet 工具通常会在项目文件中创建对包的引用packages.config,然后执行包还原,以有效方式安装包。 例外是 nuget install,它只将包扩展到文件夹中 packages ,并且不会修改任何其他文件。

常规过程如下所示:

  1. (所有工具除外 nuget.exe)将包标识符和版本记录到项目文件或 packages.config.

    如果安装工具是 Visual Studio 或 dotnet CLI,该工具会首先尝试安装包。 如果不兼容,则包不会被添加到项目文件或 packages.config

  2. 获取软件包:

    • 检查包(按确切的标识符和版本号)是否已安装在 全局包 文件夹中,如 管理全局包和缓存文件夹中所述。

    • 如果包不在 全局包 文件夹中,则尝试从 配置文件中列出的源中检索它。 此时会应用包源映射配置。 对于在线来源,请首先尝试从 HTTP 缓存中检索包,除非使用 -NoHttpCache 命令指定了 nuget.exe 或使用 --no-http-cache 指定了 dotnet restore。 (Visual Studio 并 dotnet add package 始终使用缓存。如果使用缓存中的包,输出中会显示“CACHE”。 缓存的过期时间为 30 分钟。

    • 如果包是使用 浮动版本指定的,或者没有最低版本,则 NuGet 联系所有源以找出最佳匹配项。 示例: 1.*(, 2.0.0].

    • 如果包不在 HTTP 缓存中,请尝试从配置中列出的源下载它。 如果下载包,输出中会显示“GET”和“OK”。 NuGet 在正常详细程度上记录 http 流量。

    • 如果无法从任何源成功获取包,则此时安装会失败,并出现 NU1103 等错误。 请注意,来自命令 nuget.exe 的错误仅显示已检查的最后一个来源,但这表示无法从任何来源获取该包。

    获取包时,NuGet 配置中的源顺序可能适用:

    • NuGet 在检查 HTTP 源之前检查源本地文件夹和网络共享。
  3. 管理全局包和缓存文件夹中所述,将包的副本和其他信息保存在 http 缓存文件夹中。

  4. 如果下载,请将包安装到每用户 全局包 文件夹中。 NuGet 为每个包标识符创建一个子文件夹,然后为每个已安装的包版本创建子文件夹。

  5. NuGet 根据需要安装包依赖项。 此过程可能会更新进程中的包版本,如 依赖项解析中所述。

  6. 更新其他项目文件和文件夹:

    • 对于使用 PackageReference 的项目,请更新存储在中的 obj/project.assets.json包依赖项关系图。 包内容本身不会复制到任何项目文件夹中。
    • 更新 app.config 和/或 web.config,如果该包使用源和配置文件转换
  7. (仅限 Visual Studio)在 Visual Studio 窗口中显示包的自述文件(如果可用)。

使用 NuGet 包享受高效编码!