只有在构建项目输出时,如何有条件地运行MSBuild任务?

时间:2010-10-16 22:19:53

标签: msbuild

我想运行一个MSBuild任务(签署一个可执行文件/ dll),但只有当输出exe / dll发生了变化时。如果没有任何源文件发生更改导致重新编译exe / dll,那么我不希望该任务运行。

尽管花费了几个小时尝试不同的事情,但我无法弄清楚如何在我的编译输出文件发生变化的情况下编译项目时才能运行目标任务(换句话说,我认为没有跳过CoreCompile目标)。

2 个答案:

答案 0 :(得分:2)

应使用this answer ::

TargetOutputs parameter相同
<MSBuild Projects="File.sln" >
   <Output TaskParameter="TargetOutputs" ItemName="AssembliesBuiltByChildProjects" />
</MSBuild>
<Message Text="Assemblies built: @(AssembliesBuiltByChildProjects)" /> <!-- just for debug -->
<CallTarget Targets="SignExe" Condition="'@(AssembliesBuiltByChildProjects)'!=''" />

答案 1 :(得分:2)

你可以这样做:

<PropertyGroup>
  <TargetsTriggeredByCompilation>DoStuffWithNewlyCompiledAssembly</TargetsTriggeredByCompilation>
</PropertyGroup>

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

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

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