.net 使用NuGet软件包确保可复制的构建

.net 使用NuGet软件包确保可复制的构建,.net,dependencies,nuget,versioning,binary-reproducibility,.net,Dependencies,Nuget,Versioning,Binary Reproducibility,我有一个名为Application的.NET应用程序 此应用程序依赖于两个NuGet软件包: 数据库,第2版* 日志记录,第3版* 数据库包取决于两个附加包: DTO,第1版* DAL,第4版* 目前,应用程序使用以下具体的软件包版本:数据库版本2.1,日志版本3.1 我构建我的应用程序,NuGet解析并下载依赖项,因此我得到DTO1.5版和DAL4.0版。我将我的应用程序放入安装包并交付给客户。我在git中将此版本标记为app-1.0 因此,我的客户获得以下二进制文件: Applic

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

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

  • 数据库
    ,第2版*
  • 日志记录
    ,第3版*
数据库
包取决于两个附加包:

  • DTO
    ,第1版*
  • DAL
    ,第4版*
目前,
应用程序
使用以下具体的软件包版本:
数据库
版本2.1,
日志
版本3.1

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

因此,我的客户获得以下二进制文件:

  • Application.exe
    ,版本1.0
  • 数据库.dll
    ,版本2.1
  • Logging.dll
    ,版本3.1
  • DTO.dll
    ,版本1.5
  • DAL.dll
    ,版本4.0
一年后,客户提交了一个bug,我需要对此进行彻底分析。为了重现这个问题,我需要与客户相同的二进制文件,因此我查看标签
app-1.0
,并希望构建我的应用程序

同时,
DAL
DTO
包在NuGet提要上进行了更新:最新的
DTO
版本为1.7,
DAL
版本为4.5

我的问题是:

  • 当我现在构建我的应用程序时,NuGet是否将
    数据库
    依赖项解析为最新的可用版本?那么,我是否将
    dto1.7
    dal4.5
    替换为
    dto1.5
    dal4.0
    (用于构建
    app-1.0
  • 如果是,我如何使用NuGet确保我的版本的二进制再现性
  • 如果没有,NuGet如何解决“正确”的引用

NuGet在版本4.9(Visual Studio 2017,15.9)、.NET核心SDK 2.1.500中引入了锁文件

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


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

您使用的是一个具体的nuget软件包,其版本在
packages.config
PackageReference
中指定。您可以使用旧版本的软件包(当然,如果您没有更新它们的话)构建标记为
app-1.0
的代码@PavelAnikhouski问题不在于我直接引用的软件包。问题是关于我引用的包的浮动依赖项。您在nuget上指定了依赖包的最低版本。答案取决于
数据库
包配置。如果它与旧版本的
DTO
DAL
一起工作,那么构建代码不会有任何问题。如果根据
app-1.0
构建代码而不使用nuget中的
Update Package
更新软件包版本,也不会出现问题