禁用特定MsBuild项目的可传递PackageReference依赖项

时间:2018-09-06 15:27:41

标签: msbuild visual-studio-2017 nuget transitive-dependency packagereference

我正在将旧样式的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添加显式引用?

2 个答案:

答案 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。如果您有一个标有私人资产的软件包,则只​​会阻止它流入父项目或打包。

enter image description here

<PackageReference Include="B" Version="1.0.0" PrivateAssets="all">
<PackageReference Include="C" Version="1.0.0" PrivateAssets="all">

您可以检查文档Controlling dependency assetsthis thread以获得一些详细信息。

希望这会有所帮助。