使用NuGet时如何防止引用升级

时间:2017-10-23 07:31:40

标签: .net msbuild nuget

我的.csproj项目简单参考。

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="12.0">
...
  <ItemGroup>
    <Reference Include="System.Net.Http" />
  </ItemGroup>
...

我还有用于NuGet引用的project.json

{
  "dependencies": {
    "SomePackage": "1.1.1-beta",
  },
  "runtimes": {
    "win": {}
  },
...

使用此设置可以正常工作。 但最近&#34; SomePackage&#34;开始依赖另一个包,通过一堆传递依赖依赖于NETStandard.Library&#34;版本=&#34; 1.6.1&#34;

<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
  <metadata>
    <id>Microsoft.Extensions.Configuration</id>
    <version>1.1.0</version>
    <dependencies>
      <group targetFramework=".NETStandard1.1">
        <dependency id="Microsoft.Extensions.Configuration.Abstractions" version="1.1.0" />
        <dependency id="NETStandard.Library" version="1.6.1" />
      </group>
    </dependencies>
  </metadata>
</package> 

NETStandard.Library依赖于较新版本的System.Net.Http 4.1.0.0

当我编译项目时,程序集开始直接引用新版本System.Net.Http。

然后当然它开始在运行时要求这个dll。

我编译.net 4.6.2和针对.Net标准1.1编译的Microsoft.Extensions.Configuration。所以它应该在安装了4.6.2的机器上工作。 但4.6.2不包含System.Net.Http 4.1.0.0的新版本

所以我的问题是如何阻止NuGet和MsBuild将我的程序集的直接引用升级到我使用的包的传递依赖项版本?

谢谢。

1 个答案:

答案 0 :(得分:0)

如果您只担心其唯一的汇编参考,那么AutoUnifyAssemblyReferences就是您的答案。如果您使用的是Visual Studio 2017,请转到路径C:\Program Files (x86)\MSBuild\14.0\Bin(或安装相应MSBuild版本的相应路径)并搜索Microsoft.CSharp.targets文件。这是Visual Studio使用的目标文件,因此在构建解决方案时由MSBuild使用。在此文件中,您可以添加以下标记:

   <AutoUnifyAssemblyReferences>false</AutoUnifyAssemblyReferences>

在这些更改后保存文件。所有后续版本都将阻止自动装配版本升级。 警告:此设置将应用于使用特定版本的Visual Studio / MSBuild构建的所有项目。解决问题后,您可以恢复为目标文件的原始版本。

为防止NuGet自动升级,您可以参考解决此问题的this堆栈溢出帖子。

编辑:如果你想在项目级别控制它,这里是你如何做到这一点。在csproj文件中,标识包含<Target>标记的部分(可能会被评论),并按以下方式修改:

   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
      <Target Name="BeforeResolveReference">
        <AutoUnifyAssemblyReferences>false</AutoUnifyAssemblyReferences>
      </Target>
   </Import>

我自己从未尝试过,但这应该在理论上有效。 Here是您可以覆盖的所有目标名称的链接,用于将AutoUnifyAssemblyReferences标记设置为false。