在将一些遗留代码从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"/>
也不起作用。
3条答案
按热度按时间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支持别名。默认情况下,不提供别名。指定别名后,来自带注解的包的所有程序集都需要使用别名引用。
yx2lnoni2#
根据我们的讨论,到目前为止,我看到的唯一选择是创建一个自定义NuGet包,它封装
A.nupkg
而不包含其依赖项:根据Microsoft文档,
<PrivateAssets>all</PrivateAssets>
应该阻止所有可传递依赖项从A.nupkg
流向使用者。在您的目标项目中:
8ehkhllq3#
您可以移除自定义目标中的引用