【问题标题】:Ensuring reproducible builds using NuGet packages使用 NuGet 包确保可重现的构建
【发布时间】:2019-12-20 07:44:48
【问题描述】:

我有一个名为 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 并想要构建我的应用程序。

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

我的问题是:

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

【问题讨论】:

  • 您正在使用在packages.configPackageReference 中指定版本的具体nuget 包。您可以使用旧版本的软件包构建标记为 app-1.0 的代码(当然,如果您没有更新它们)
  • @PavelAnikhouski 问题不在于我直接引用的包。问题是关于我引用的包的浮动依赖项
  • 您被指定了 nuget 上依赖包的最低版本。答案取决于Database 包配置。如果它适用于旧版本的DTODAL,则构建代码不会有任何问题。如果针对app-1.0 构建代码而不使用nuget 中的Update-Package 更新包版本,也没有问题

标签: .net dependencies nuget versioning binary-reproducibility


【解决方案1】:

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"

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多