MSBuild后期生成

5
我有一个 MSBuild 脚本,几乎可以做我需要的一切,除了我的后期构建步骤(请参见我之前提出的问题:MSBuild conditional Exec?)。
我想要做的是构建多个 csproj 文件,并在仅当项目已构建时可选地执行后期构建步骤。我不想总是执行后期构建步骤,否则最终输出的时间戳将被不必要地修改(这使得构建过程变得非常耗时,没有任何理由)。
在我的 MSBuild 脚本中,我对于每个 csproj 文件都有类似以下的东西:
<Target Name="ProjectName">
   <MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" />
</Target>

编辑: 我想我真正想做的是检测每个项目运行CoreCompile任务的时候。如果有一种方法可以在条件中检查这个呢?

有什么想法吗?

我对MSBuild还很陌生,也许我完全走错了方向!

谢谢, 艾伦

3个回答

5
您可以根据构建过程中选择的配置来完成此操作。对于 CI,您应始终使用“发布”或“生产”(您可以定义自己的)。
<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>

这是有效的,因为微软的某位聪明人在 Microsoft.[CSharp|VisualBasic][.Core].targets 中的 CoreCompile 目标的末尾添加了以下行(文件名取决于语言和 MSBuild/Visual Studio 版本)。
<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/>

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接