如何根据元数据将某些项目引用设置为 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) 和一些其他元数据计算为“”,这意味着程序集无论如何都会被复制。
您可以将在 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
一起使用)
希望对您有所帮助:)
我有两个解决方案。第一个解决方案将程序集输出到 /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) 和一些其他元数据计算为“”,这意味着程序集无论如何都会被复制。
您可以将在 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
一起使用)
希望对您有所帮助:)