MSBuild Post-Build

时间:2010-11-26 12:12:27

标签: c# msbuild csproj post-build

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

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

在我的MSBuild脚本中,我的每个csproj文件都有以下内容:

<Target Name="ProjectName">
   <MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" />
</Target>

修改 我认为我真正想做的是检测CoreCompile任务何时为每个项目运行。如果有某种方法可以在一个条件下检查这个?

有什么想法吗?

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

谢谢, 艾伦

3 个答案:

答案 0 :(得分:3)

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

<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/>

答案 1 :(得分:1)

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

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

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

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

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

<!-- Define common properties -->
<PropertyGroup>
    <ExecuteCommand>true</ExecuteCommand>
</PropertyGroup>

<Target Name="YourTarget">
    <!-- Build project -->
    <MSBuild Projects="Path to project" Properties="ExecuteCommand=$(ExecuteCommand)" />
</Target>

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

谢谢, 艾伦

答案 2 :(得分:0)

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

<Target Name="DoStuffWithNewlyCompiledAssembly">
    <Exec Command="command.exe" />
</Target>

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

<Target Name="Name">
  <MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" />
</Target>

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

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>

因此,如果您在TargetsTriggeredByCompilation属性中指定目标名称,则目标将在CoreCompile运行时运行 - 如果跳过CoreCompile,您的目标将无法运行(例如,因为输出程序集已经与代码相关了。)