MSBuild Post-Build

问题描述 投票:5回答:3

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

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

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

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

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

有任何想法吗?

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

谢谢,艾伦

c# msbuild csproj post-build
3个回答
3
投票

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

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

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>

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

谢谢,艾伦


0
投票

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

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

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

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

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

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

因此,如果您在TargetsTriggeredByCompilation属性中指定目标名称,那么如果CoreCompile运行,您的目标将会运行 - 如果跳过CoreCompile,您的目标将无法运行(例如,因为输出程序集已经相对于代码是最新的) 。

© www.soinside.com 2019 - 2024. All rights reserved.