繁体   English   中英

MSBuild:删除对通过 NuGet 添加的程序集的引用

[英]MSBuild: Remove Reference to Assembly added via NuGet

在将一些遗留代码从 packages.config 移动到 PackageReference 的过程中。

我有一个 NuGet 包(比如说 A.nupkg),它引用了不同的 NuPkg (B.nupkg)。 B.nupkg 包含对 Foo.dll 的引用。

一个项目在 packages.config 中引用了 A.nupkg,但 B.nupkg 没有(尽管是传递依赖项)。 问题是该项目以 Foov2.dll 的形式引用了 Foo API 的替换(相同的命名空间和类,但包括错误修复)

现在随着对 PackageReference 的更改,传递依赖被拾取,Foo.dll 被项目引用,我们最终在 Foo.dll 和 Foov2.dll 之间得到了模糊的引用。 我无法更改 NuGet 包(希望可以),所以我需要一个解决方法。

我尝试在构建它之前添加一个删除不需要的引用的目标,但我找不到放置它的正确位置 - 或者来自 NuGets 的引用的处理方式可能与普通引用不同:

  <Target Name="RemoveOutdatedReferences" BeforeTargets="BeforeBuild">
    <Message Importance="High" Text="All references: @(Reference->'%(FileName)'). 
           Sadly no Foo.dll so no wonder I can't remove it."/>
    <ItemGroup>
      <Reference Remove="Foo, Version=1.2.3.4, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb" />
    </ItemGroup>
  </Target>

或者,我也尝试删除整个传递 NuGet 包,但使用<PackageReference Remove="Foo"/>也不起作用。

看起来 PackageReference Alias 功能是专门为命名空间冲突场景设计的。

https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#packagereference-aliases

在极少数情况下,不同的包将包含同一命名空间中的类。 从 NuGet 5.7 和 Visual Studio 2019 Update 7 开始,相当于 ProjectReference,PackageReference 支持别名。 默认情况下不提供别名。 指定别名时,来自带注释的包的所有程序集都需要使用别名引用。

根据我们的小讨论,到目前为止,我看到的唯一选择是创建一个自定义 NuGet 包,它封装A.nupkg而没有其依赖项:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <PackageId>My.Wrapper.Around.A<PackageId>
    <PackageVersion>1.0.0<PackageVersion>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="A" Version="x.y.z">
      <PrivateAssets>all</PrivateAssets>
    </PackageReference>
  </ItemGroup>
</Project>

根据Microsoft docs<PrivateAssets>all</PrivateAssets>应防止A.nupkg的所有传递依赖项流向消费者。

在您的目标项目中:

<Project Sdk="Microsoft.NET.Sdk">
  <ItemGroup>
    <PackageReference Include="My.Wrapper.Around.A" Version="1.0.0" />
    <PackageReference Include="Foov2" Version="1.0.0" />
  </ItemGroup>
</Project>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM