MSBuild Post-Build

Ala*_*ark 5 c# msbuild csproj post-build

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

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

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

<Target Name="ProjectName">
   <MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" />
</Target>
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

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

谢谢,艾伦

sil*_*948 5

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

<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/>
Run Code Online (Sandbox Code Playgroud)


Ala*_*ark 1

经过多次寻找这个问题的简单解决方案后,我没有找到一个解决方案,最终提出了我自己的解决方案,该解决方案可行,但可能不是最好的解决方案。但是,我想与遇到同样问题的其他人分享它,以便您至少可以找到一个可行的解决方案,并希望为您省去很多麻烦。

回顾一下,我想做的是在项目构建后运行命令行工具,但前提是程序集已更新(即时间戳发生更改)。我不想将其放入每个项目的构建后部分,因为我只希望构建后发生在我们的构建服务器(而不是开发机器)上。

我在主 .proj 文件中没有找到任何外部执行此操作的方法,并且最终更改了每个 .csproj 文件的构建后部分。但是,我在它前面加上了一个 if 条件,如下所示:

if '$(ExecuteCommand)' == 'true' command.exe
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢,艾伦