【问题标题】:MSBuild Post-BuildMSBuild 构建后
【发布时间】:2010-11-26 12:12:27
【问题描述】:

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

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

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

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

编辑: 我认为我真正想做的是检测 CoreCompile 任务何时为每个项目运行。是否有某种方法可以检查这种情况?

有什么想法吗?

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

谢谢, 艾伦

【问题讨论】:

    标签: c# msbuild csproj post-build


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      我没有在我的主 .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>
      

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

      谢谢, 艾伦

      【讨论】:

        【解决方案3】:

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

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

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

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

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

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

        因此,如果您在 TargetsTriggeredByCompilation 属性中指定目标名称,则如果 CoreCompile 运行,您的目标将运行-- 如果跳过 CoreCompile,您的目标将不会运行(例如,因为输出程序集已经启动-迄今为止关于代码)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-05
          • 2012-09-26
          • 2023-03-29
          • 2012-12-08
          • 2013-06-23
          • 2011-01-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多