6

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

4

2 回答 2

2

禁用特定 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">

您可以查看文档控制依赖项资产此线程以获取一些详细信息。

希望这可以帮助。

于 2018-09-07T03:11:43.667 回答
2

我最终使用一种解决方法将传递依赖项移动到别名以解决编译器错误。

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

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

于 2018-09-10T07:09:10.230 回答