MSBuild Post-Build

我有一个MSBuild脚本,除了我的后期构建步骤之外,还要执行我需要做的所有事情(请参阅我之前提出的问题: MSBuild条件Exec? )。

我正在寻找的是构建许多csproj文件,并且当且仅当项目构建时,可选择执行构建后步骤。 我不想一直执行我的后期构建步骤,否则我的最终输出上的时间戳将被不必要地修改(并且它使构建过程非常耗时而无缘无故)。

在我的MSBuild脚本中,我为每个csproj文件提供了以下内容:

   

编辑:我认为我真正想做的是检测CoreCompile任务何时为每个项目运行。 如果在某种情况下有某种方法来检查这个问题?

有任何想法吗?

我是MSBuild的新手,所以也许我完全走错了轨道!

谢谢,艾伦

您也可以根据构建过程中选择的配置来执行此操作。 对于CI,您应该始终使用“Release”或“Production”(您可以定义自己的)

  

经过多次寻找这个问题的简单解决方案后,我找不到一个,最终找到了我自己的解决方案,但可能不是最好的解决方案。 但是,我想与其他遇到同样问题的人分享,这样你至少可以找到一个有效的解决方案,并希望能为你节省很多头脑。

回顾一下,我想要做的是在构建项目之后运行命令行工具,但仅在程序集更新时(即时间戳已更改)。 我不想把它放到每个项目的后期构建部分,因为我只想在构建服务器(而不是开发机器)上进行后期构建。

我没有找到任何在我的主.proj文件中外部执行此操作的方法,并且最终改变了每个.csproj文件的构建后部分。 但是,我用if这样的条件作为前缀:

 if '$(ExecuteCommand)' == 'true' command.exe 

这意味着该命令永远不会在开发机器上执行,但是当我从.proj文件调用构建时,我可以将该标志设置为true,如下所示:

   true      

正如我所说,我不认为这是最优雅的解决方案,但它确实有效,对我来说已经足够了。 但是,我仍然有兴趣了解实现这一目标的正确方法是什么,以便我可以改进我的脚本。

谢谢,艾伦

如果您可以为每个项目添加以下内容:

    

…那么你只需要添加一个属性:

    

这很有效,因为有人聪明地在Microsoft的CoreCompile目标末尾添加了以下行Microsoft.[CSharp|VisualBasic][.Core].targets (文件名取决于语言和MSBuild / Visual Studio版本)。

  

因此,如果在TargetsTriggeredByCompilation属性中指定目标名称,则在TargetsTriggeredByCompilation运行时将运行目标 – 如果CoreCompile CoreCompile,则目标将不会运行(例如,因为输出程序集已经与代码相关) 。