.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版*日志记录
数据库
包取决于两个附加包:
,第1版*DTO
,第4版*DAL
应用程序
使用以下具体的软件包版本:数据库
版本2.1,日志
版本3.1
我构建我的应用程序
,NuGet解析并下载依赖项,因此我得到DTO
1.5版和DAL
4.0版。我将我的应用程序
放入安装包并交付给客户。我在git中将此版本标记为app-1.0
因此,我的客户获得以下二进制文件:
,版本1.0Application.exe
,版本2.1数据库.dll
,版本3.1Logging.dll
,版本1.5DTO.dll
,版本4.0DAL.dll
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如何解决“正确”的引用
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
更新软件包版本,也不会出现问题