使用 NuGet 包确保可重现的构建
Ensuring reproducible builds using NuGet packages
我有一个名为 Application
的 .NET 应用程序。
此应用程序依赖于两个 NuGet 包:
Database
,版本 2.*
Logging
,版本 3.*
Database
包依赖于另外两个包:
DTO
,版本 1.*
DAL
,版本 4.*
目前,Application
使用这些具体的包版本:Database
2.1 版,Logging
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
并希望构建我的应用程序。
同时,DAL
和 DTO
包在 NuGet 源上更新:最新的 DTO
版本是 1.7,DAL
版本是 4.5。
我的问题是:
- 当我现在构建我的应用程序时,NuGet 是否会将
Database
依赖项解析为最新的可用版本?那么我得到 DTO 1.7
和 DAL 4.5
而不是 DTO 1.5
和 DAL 4.0
(用于构建 app-1.0
)吗?
- 如果是,我如何使用 NuGet 确保我的版本的二进制再现性?
- 如果不是,NuGet 如何解决 "right" 引用?
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 上执行此操作] 机器。
我有一个名为 Application
的 .NET 应用程序。
此应用程序依赖于两个 NuGet 包:
Database
,版本 2.*Logging
,版本 3.*
Database
包依赖于另外两个包:
DTO
,版本 1.*DAL
,版本 4.*
目前,Application
使用这些具体的包版本:Database
2.1 版,Logging
3.1 版。
我构建了 Application
,NuGet 解析并下载了依赖项,因此我得到了 DTO
1.5 版和 DAL
4.0 版。我将我的 Application
放入安装包中并交付给我的客户。我在 git 中用 app-1.0
标记了这个版本。
所以我的客户得到以下二进制文件:
Application.exe
,版本 1.0Database.dll
,版本 2.1Logging.dll
,版本 3.1DTO.dll
,版本 1.5DAL.dll
, 版本 4.0
一年后,客户提交了一个错误,我需要对其进行彻底分析。要重现该问题,我需要与客户相同的二进制文件,因此我检查了标签 app-1.0
并希望构建我的应用程序。
同时,DAL
和 DTO
包在 NuGet 源上更新:最新的 DTO
版本是 1.7,DAL
版本是 4.5。
我的问题是:
- 当我现在构建我的应用程序时,NuGet 是否会将
Database
依赖项解析为最新的可用版本?那么我得到DTO 1.7
和DAL 4.5
而不是DTO 1.5
和DAL 4.0
(用于构建app-1.0
)吗? - 如果是,我如何使用 NuGet 确保我的版本的二进制再现性?
- 如果不是,NuGet 如何解决 "right" 引用?
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 上执行此操作] 机器。