我正在将旧样式MsBuild csproj项目迁移到使用PackageReference格式,并且遇到了传递依赖项的问题。
考虑以下项目A引用NuGet包B和C,每个包含一个使用PackageReference的单个程序集。在构建项目A上使用IL合并将B作为公共符号合并到A程序集中,将C作为内部化符号合并。项目D有一个项目参考A.
传递依赖关系案例D引用A,B和C.当构建D时,编译类型错误CS0433的错误:“A”和“B”都存在类型“X”。
有没有办法强制D在上面的场景中不添加对B或C的显式引用?
我最终使用workaround将传递依赖项移动到别名以绕过编译器错误。
<Target Name="ChangeAliasesOfBNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
<ItemGroup>
<ReferencePath Condition="'%(FileName)' == 'B'">
<Aliases>nonmerged</Aliases>
</ReferencePath>
</ItemGroup>
</Target>
我试图使用私有资产,但无法以这种方式消除编译器错误。
禁用特定MsBuild项目的传递PackageReference依赖项
如果我理解你是正确的,你可以尝试使用属性<PrivateAssets>all</PrivateAssets>
or 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了解一些细节。
希望这可以帮助。