使用 NuGet 包确保可重现的构建

Ensuring reproducible builds using NuGet packages

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

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

Database 包依赖于另外两个包:

目前,Application 使用这些具体的包版本:Database 2.1 版,Logging 3.1 版。

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

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

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

同时,DALDTO 包在 NuGet 源上更新:最新的 DTO 版本是 1.7,DAL 版本是 4.5。

我的问题是:

NuGet 在 4.9 版(Visual Studio 2017、15.9)、.NET Core SDK 2.1.500 中引入了锁定文件。 The blog post that introduces it is even titled "Enable repeatable package restores using a lock file"

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

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