如何从MSBUILD覆盖.NET中的引用的CopyLocal(专用)设置

时间:2009-11-05 17:07:31

标签: .net msbuild

我已经和它搏斗了几天,经过大量的搜索,我找不到我应该走的路。

我想要做的是设置一个MSBUILD项目,该项目将构建我们的整个.NET应用程序(8个解决方案的常量,以及可能在它们之间拆分的250个项目),并从各个项目文件中覆盖许多设置我自己的调试版本。

具体来说,我想构建我们的发布配置,优化关闭并生成完整的调试信息/ pdbs。另外,为了减少我们当前超长的构建时间,我希望每个项目的每个引用都“复制本地”(或在实际的proj文件xml中为private)false。

第一件事情相当简单,我可以相当轻松地覆盖项目级属性(你甚至可以使用/ p从MSBuild命令行执行此操作),但我无法弄清楚如何覆盖属性一个参考。我已经尝试过在StackOverflow和网络上看到的几件事,但还没有解决方案。

我可以通过改变Microsoft.Common.targets来做我想做的事情,注释掉_CopyFilesMarkedCopyLocal目标中的代码会完全跳过这些文件的复制。但我不想改变我的全局配置并在所有情况下都这样做。我创建了自己的备用目标文件 - 如果我将单个项目文件更改为指向它,则可以正常工作 - 但我无法弄清楚如何指定它在顶层使用(我的.proj文件只是构建所有8种解决方案)。如果我能以某种方式覆盖顶层的_CopyFilesMarkedCopyLocal目标,那将是很好的,这样如果MS更改默认目标文件,我的构建不会搞砸,但我也无法弄清楚如何使这项工作。

最好的方法是,如果有一种方法可以覆盖引用级属性,就像你可以项目级属性一样,而不必重写/覆盖构建目标的东西 - 但我没有发现任何信息表明这是可能的。

提前感谢您提供任何帮助。

P.S。实际上我不可能只浏览所有项目文件并进行更改;我需要一个解决方案,将现有代码保留原样。

3 个答案:

答案 0 :(得分:30)

试试这个:

CustomAfterMicrosoftCommonTargets 设置为C:\ foo \ filter.targets (或您为文件命名的任何内容)并将filter.targets设置为:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemDefinitionGroup>
      <Reference>
        <Private>False</Private>
      </Reference>
    </ItemDefinitionGroup>
</Project>

答案 1 :(得分:7)

在像filter.targets这样的文件中添加目标:

<Target Name="BeforeBuild">
  <ItemGroup>
        <ReferenceNew Include="@(Reference)">
           <Private>False</Private>
        </ReferenceNew>
        <Reference Remove="@(Reference)"/>
        <Reference Include="@(ReferenceNew)"/>
  </ItemGroup>
</Target>

这将重新创建@(引用)列表,使元数据“Private”设置为false,这将确保不会复制引用。 然后使用属性$(CustomAfterMicrosoftCommonTargets)设置为此filter.targets文件的路径来构建您的解决方案或项目。

msbuild foo.sln /p:CustomAfterMicrosoftCommonTargets=c:\foo\filter.targets

这样,在构建项目之前将调用BeforeBuild目标,并相应地设置所有引用。如果您想要更多地控制何时或者Private是false还是true,您可以更改BeforeBuild目标并通过属性控制它。

编辑:可能有更好的方法在BeforeBuild目标中设置元数据。

答案 2 :(得分:1)

从msbuild v 15开始,您可以在包含源代码的根文件夹中复制名为 Directory.Build.props 的单个文件。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemDefinitionGroup>
  <Reference>
    <Private>False</Private>
  </Reference>
</ItemDefinitionGroup>
</Project>

这适用于Visual Studio 2017和vNext Build。您可能必须关闭Visual Studio,然后再次打开解决方案以获取文件效果。

https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build#directorybuildprops-and-directorybuildtargets