2

我有一个名为 .NET 的应用程序Application

此应用程序依赖于两个 NuGet 包:

  • Database, 版本 2.*
  • Logging, 版本 3.*

Database软件包依赖于两个附加软件包:

  • DTO, 版本 1.*
  • DAL, 版本 4.*

目前,Application使用这些具体的包版本:Database2.1Logging版、3.1 版。

我构建我的Application,NuGet 解析并下载依赖项,所以我得到DTO版本 1.5 和DAL版本 4.0。我将我Application的安装包放入并交付给我的客户。我在 git 中用app-1.0.

所以我的客户得到以下二进制文件:

  • Application.exe, 版本 1.0
  • Database.dll, 2.1 版
  • Logging.dll, 版本 3.1
  • DTO.dll, 1.5 版
  • DAL.dll, 4.0 版

一年后,客户提交了一个我需要彻底分析的错误。为了重现该问题,我需要与客户相同的二进制文件,因此我检查了标签app-1.0并想要构建我的应用程序。

同时,在 NuGet 源上更新了DAL和包:最新版本为 1.7,版本为 4.5。DTODTODAL

我的问题是:

  • 当我现在构建我的应用程序时,NuGet 是否会将Database依赖关系解析为最新的可用版本?我也得到了DTO 1.7DAL 4.5而不是DTO 1.5and DAL 4.0(用于构建app-1.0)?
  • 如果是,我如何使用 NuGet 确保我的版本的二进制重现性?
  • 如果不是,NuGet 如何解决“正确”的引用?
4

1 回答 1

3

NuGet 在版本 4.9(Visual Studio 2017、15.9)、.NET Core SDK 2.1.500 中引入了锁定文件。介绍它的博客文章甚至标题为“使用锁定文件启用可重复的包恢复”

该博客文章仅列出了一种启用锁定文件的方法。packages.lock.json一种方法是在与项目文件 ( ) 相同的目录中创建一个名为的空文件csproj,然后进行恢复。另一种方法是dotnet restore --use-lock-file在命令行上运行。另一种方法是将RestorePackagesWithLockFileMSBuild 属性设置为true,这可以通过多种方式实现(项目文件中的属性、 中的属性Directory.Build.props、环境变量、命令行参数)。

创建锁定文件后,它将始终使用,因此您不再需要像第一次那样明确选择加入。请注意,默认情况下,restore 会在发现更改时更新锁定文件。如果您想在无法恢复完全相同的软件包时恢复失败,您需要选择“锁定模式”,例如dotnet restore --locked-mode,您可能希望在 CI 机器上执行此操作。

于 2019-12-19T23:44:48.517 回答