如何根据元数据将某些项目引用设置为 CopyLocal = false?

How do I set some project references to CopyLocal = false based on metadata?

我有两个解决方案。第一个解决方案将程序集输出到 /bin/Debug。第二种解决方案引用该文件夹中的程序集,并在构建时输出到 /bin/Debug/AddOn。

如何防止第二个解决方案中的项目将其在 /bin/Debug 中引用的程序集复制到 /bin/Debug/Addon 中,而不编辑每个项目文件以将 CopyLocal 设置为 False?

我正在尝试使用适用于第二种解决方案中的项目的 Directory.Build.props 来解决这个问题。

<Project>
  <ItemDefinitionGroup>
    <Reference Condition="$([System.String]::new('%(Reference.FullPath)').Contains('bin/Debug'))">
      <Private>false</Private>
    </Reference>
  </ItemDefinitionGroup>
</Project>

MSBuild 将 $(Reference.FullPath) 和一些其他元数据计算为“”,这意味着程序集无论如何都会被复制。

GitHub Repo

您可以将在 ResolveAssemblyReferences 目标之后执行的目标添加到 AddOn.csproj 中,如下所示:

  <Target Name="ClearReferenceCopyLocalPaths" AfterTargets="ResolveAssemblyReferences">
    <ItemGroup>
      <FilesToExclude Include="@(ReferenceCopyLocalPaths)" Condition="$([System.String]::new('%(ReferenceCopyLocalPaths.FullPath)').Contains('bin\Debug'))"/>
      <ReferenceCopyLocalPaths Remove="@(FilesToExclude)" />
    </ItemGroup>
  </Target>

我认为ReferenceCopyLocalPaths项目是您需要的。从 Don’t copy my referenced assemblies and this blog 获得一些提示。由于您希望此脚本应用于解决方案中的所有项目,您可以将此目标脚本添加到 Directory.Build.props 并将此文件放在 solution folder.

另外:在你的脚本中,我认为在那种情况下你应该使用bin\Debug而不是bin/Debug。 (一旦我在 contains 函数中使用 bin\Debug 它运行良好,但在我测试后不能与 bin/Debug 一起使用)

希望对您有所帮助:)