Visual Studio 如何通过NuGet更新未作为PackageReference直接引用的依赖项?

lx0bsm1f  于 2022-11-25  发布在  其他
关注(0)|答案(3)|浏览(204)
  • 此问题类似于here中描述的问题。*

当使用“传统”风格的.csproj项目文件时,我们有一个单独的packages.config文件,其中列出了所有依赖项,包括可传递的依赖项。这使得当安装一个带有依赖项的包,然后决定哪些可传递的依赖项可以手动更新时,可以使用用例。因此,好处是:

  • 由于存在平面列表,因此可以轻松识别依赖项
  • 对所有依赖关系版本进行细粒度控制

例如,从NuGet安装Autofac.WebApi2.Owin后,我们会看到类似this的图片:
可以很容易地手动更新清晰可见的传递依赖关系。
当使用新的SDK样式.csproj项目时,NuGet引用将作为<PackageReference/>添加到项目文件本身,并且MSBuild将以静默方式引用可传递依赖项:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net462</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Autofac.WebApi2.Owin" Version="4.0.0" />
  </ItemGroup>
</Project>

因此,要更新传递依赖关系,必须
1.识别它们(例如,通过obj/project.assets.json
1.将它们全部显式添加到项目中
1.执行更新
这必须在每次更新后完成,并且对于项目中的每个(!)传递依赖项,这显然几乎是不可能的。
可能的解决方案:

  • 自动将传递依赖项添加到项目
  • 在NuGet GUI中显示可传递依赖项更新

遗憾的是,在文档中未找到此类功能。
那么,有没有一种简单的方法可以从两个世界中获得最好的呢?

beq87vna

beq87vna1#

目前不可能,但正在讨论Github

u4dcyp6a

u4dcyp6a2#

那么,有没有一种简单的方法可以从两个世界中获得最好的呢?
我认为NuGet已经有了一个简单的方法来从两个世界中获得最好的。
当使用新的Sdk样式.csproj项目时,您会注意到在Reference:

有了这个结构,我们不仅可以得到一个平面列表**,还可以清楚地知道包之间的具体依赖关系**。在“传统”风格的.csproj中,我们可以知道平面列表,但是我们无法知道每个包之间的具体依赖关系。我们需要选择每个包,然后检查它的依赖关系。这是非常不方便的。
此外,我们一般不会检查包本身并直接更新其依赖项,这会带来很多依赖项之间的冲突。当您使用新的SDK风格时,NuGet隐藏了每个包的所有依赖项,从而使NuGet包管理器UI和项目文件.csproj看起来非常简单。
如果你还想单独更新其中一个依赖项,你可以安装它,nuget会提示你,你正在将包从版本1更新到版本2:比如,Autofac:

在这种情况下,您可以通过NuGet更新未作为PackageReference直接引用的依赖项。
欲了解更多详细信息,您可以参考以下博客:
https://blog.nuget.org/20170316/NuGet-now-fully-integrated-into-MSBuild.html

jv4diomz

jv4diomz3#

https://github.com/NuGet/Home/issues/5553中现在正在跟踪控制可传递包引用更新的能力

相关问题