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

Disable transitive PackageReference dependency for a specific MsBuild project

我正在将旧式 MsBuild csproj 项目迁移到使用 PackageReference 格式,并且 运行 遇到了传递依赖项的问题。

考虑以下问题 项目 A 引用 NuGet 包 B 和 C,每个都包含一个使用 PackageReference 的程序集。 在构建项目 A 中,使用 IL merge 将 B 作为 public 符号合并到 A 程序集中,并将 C 作为内部化符号。 项目 D 具有对 A 的项目引用。

传递依赖案例 D 引用 A、B 和 C。 构建D时,编译错误类型 错误 CS0433:类型 'X' 存在于 'A' 和 'B' 中 发生。

在上面的场景中,有没有办法强制D不添加对B或C的显式引用?

Disable transitive PackageReference dependency for a specific MsBuild project

如果我的理解正确,您可以尝试使用 属性 <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 and this thread 了解一些详细信息。

希望这对您有所帮助。

我最终使用 workaround 将传递依赖项移动到别名以绕过编译器错误。

<Target Name="ChangeAliasesOfBNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
  <ItemGroup>
    <ReferencePath Condition="'%(FileName)' == 'B'">
      <Aliases>nonmerged</Aliases>
    </ReferencePath>
  </ItemGroup>
</Target>

我尝试使用私有资产,但无法以这种方式消除编译器错误。