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

时间:2017-09-14 09:03:35

标签: visual-studio nuget

此问题类似于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
  2. 将所有这些明确添加到项目
  3. 执行更新
  4. 这必须在每次更新之后和项目中的每个(!)传递依赖关系中完成,这显然几乎是不可能的。

    可能的决议:

    • 自动向项目添加传递依赖
    • 在NuGet GUI中显示传递依赖关系更新

    不幸的是,文档中没有找到这样的功能。

    那么,是否有一种简单的方法可以从两个世界中获得最佳效果?

2 个答案:

答案 0 :(得分:0)

  

那么,是否有一种简单的方法可以从两个世界中获得最佳效果?

我认为NuGet已经有了一个从两个世界中获得最佳效果的简单方法。

使用新的Sdk样式.csproj项目时,您会注意到Reference中存在传递依赖关系的树结构:

enter image description here

通过这种结构,我们不仅可以获得平面列表还可以清楚地了解包之间的特定依赖关系。在“遗留”式.csproj中,我们可以知道平面列表,但我们无法知道每个包之间的特定依赖关系。我们需要选择每个包,然后检查它的依赖关系。这非常不方便。

此外,我们通常不会检查包本身并直接更新其依赖项,这会在依赖项之间带来很多冲突。当您使用新的Sdk样式时,NuGet隐藏了每个包的所有依赖关系,因此NuGet包管理器UI和项目文件.csproj看起来非常简单。

如果你仍想单独更新一个依赖项,你可以安装它,nuget会提示你,你是从版本1到版本2的更新包:比如,Autofac:

enter image description here

在这种情况下,您可以通过NuGet更新未直接作为PackageReference引用的依赖项。

有关详细信息,请参阅以下博客:

https://blog.nuget.org/20170316/NuGet-now-fully-integrated-into-MSBuild.html

答案 1 :(得分:0)

目前无法进行,但Github已开启讨论。