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

2lpgd968  于 2023-02-26  发布在  .NET
关注(0)|答案(3)|浏览(172)

在将一些遗留代码从packages.config移动到PackageReference的过程中。
我有一个NuGet包(比如说A.nupkg),它引用了另一个NuPkg(B.nupkg),B.nupkg包含了对Foo.dll的引用。
一个项目在packages.config中引用了A.nupkg,但是B.nupkg没有引用(尽管它是一个可传递的依赖项)。问题是这个项目引用了API的一个直接替换(相同的命名空间和类,但是包括bug修复),其形式是Foov2.dll
现在,随着对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"/>也不起作用。

jm81lzqq

jm81lzqq1#

似乎PackageReference Alias功能是专门为命名空间冲突的情况设计的。
https://learn.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#packagereference-aliases
在极少数情况下,不同的包会在同一命名空间中包含类。从NuGet 5.7和Visual Studio 2019 Update 7(等效于ProjectReference)开始,PackageReference支持别名。默认情况下,不提供别名。指定别名后,来自带注解的包的所有程序集都需要使用别名引用。

yx2lnoni

yx2lnoni2#

根据我们的讨论,到目前为止,我看到的唯一选择是创建一个自定义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文档,<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>
8ehkhllq

8ehkhllq3#

您可以移除自定义目标中的引用

<Target Name="CustomBeforeBuild" AfterTargets="ResolvePackageDependenciesForBuild">
    <ItemGroup> 
      <ReferenceToBeRemoved Include="@(Reference)" Condition="'%(Reference.PathInPackage)' == 'lib/netstandard2.0/UnneedDll.dll'" />
      <Reference Remove="@(ReferenceToBeRemoved)" />
    </ItemGroup>
    <Message Text="### References to remove: @(ReferenceToBeRemoved) ###" Importance="high" />
  </Target>

相关问题