我正在将旧样式的MsBuild csproj项目迁移到使用PackageReference格式,并且遇到了传递依赖项问题。
请考虑以下内容 项目A参考NuGet程序包B和C,每个程序包都使用PackageReference包含一个单个程序集。 在构建项目上,A使用IL合并将B作为A中的公共符号合并到C中并将C作为内部符号合并。 项目D的项目引用为A。
传递依赖项D引用A,B和C。 构建D时,编译类型为的错误 错误CS0433:类型“ X”同时存在于“ A”和“ B”中 发生。
在上述情况下,是否有任何方法可以强制D不向B或C添加显式引用?
答案 0 :(得分:2)
我最终使用workaround将可传递依赖项移至别名以解决编译器错误。
<Target Name="ChangeAliasesOfBNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
<ItemGroup>
<ReferencePath Condition="'%(FileName)' == 'B'">
<Aliases>nonmerged</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
我尝试使用私有资产,但是无法以这种方式消除编译器错误。
答案 1 :(得分:0)
为特定的MsBuild项目禁用可传递的PackageReference依赖项
如果我理解您的观点正确,则可以尝试将属性<PrivateAssets>all</PrivateAssets>
或PrivateAssets="all"
用于PackageReference
。如果您有一个标有私人资产的软件包,则只会阻止它流入父项目或打包。
<PackageReference Include="B" Version="1.0.0" PrivateAssets="all">
<PackageReference Include="C" Version="1.0.0" PrivateAssets="all">
您可以检查文档Controlling dependency assets和this thread以获得一些详细信息。
希望这会有所帮助。