我试图了解Microsoft.AspNetCore.App的前滚机制应如何与其他nuget包一起使用。
到目前为止,我的理解是,每当我发布应用程序时,.netcore都会自动将其发布为已安装的最新修补程序版本。在我看来,这听起来不是一种好习惯。我认为该应用程序应该部署在其开发的.net版本上。
最近,我遇到了一个问题,即我的构建服务器安装的SDK比开发计算机上的SDK更新,因此它尝试使用较新的.netcore版本发布该应用程序。
这导致构建因以下错误而中断:
error NU1605: Detected package downgrade: Microsoft.EntityFrameworkCore.Design from 2.1.8 to 2.1.4. Reference the package directly from the project to select a different version.
我明确指定了我想要Microsoft.EntityFrameworkCore.Design的2.1.4版本,因为那是我最初开发该应用程序时可用的最新版本。
我觉得我在这里想念什么。我应该确保我总是 是否在本地安装了与构建服务器相同的SDK,并且每次需要进行更改时,我所有的应用程序都更新为最新的SDK吗?如果同事想要编写针对该框架较新版本的.netcore应用程序,从而要求在构建服务器上安装新的SDK,该怎么办?当然,我也不必将我的应用程序也更新到最新的补丁程序版本。
答案 0 :(得分:0)
您遇到了这个问题,因为当您引用无版本Microsoft.AspNetCore.App
时,您不应引用已由metapackage引入的软件包。
因为该元数据包已经包含Microsoft.EntityFrameworkCore.Design
,并且您指定了硬版本,所以发生版本冲突。
这通常在以下情况下发生:您有一个项目,而另一个项目中的元包(例如测试项目)具有指定的版本。然后发生的事情是,在构建时,它将确定最高版本并使用最高版本,但是当它到达测试项目时,将需要降级(由于指定的版本),并且会抛出构建错误。直到3.0为止,建议的方法是将<Project Sdk="Microsoft.NET.Sdk.Web">
添加到测试项目中,并同时使用metapackage。
据我所知,它是这样工作的:当您引用Microsoft.AspNetCore.App
时,它将采用可能的最低版本。因此,例如,如果您的目标框架是netcoreapp2.1,则它将采用2.1.1。在构建时,它将查找已安装并使用的最高版本的共享框架。如果安装了以下运行时:2.2.0、2.1.5、2.1.12,它将向前滚动到2.1.12。还有一些与次要版本有关的其他前滚策略(无论是否为预览版本等),但仅在找不到与主要版本和次要版本相对应的运行时时才会发生。
另请参阅:https://github.com/aspnet/AspNetCore/issues/3292和https://github.com/aspnet/AspNetCore.Docs/issues/6430