我想运行一个MSBuild任务(签署一个可执行文件/ dll),但只有当输出exe / dll发生了变化时。如果没有任何源文件发生更改导致重新编译exe / dll,那么我不希望该任务运行。
尽管花费了几个小时尝试不同的事情,但我无法弄清楚如何在我的编译输出文件发生变化的情况下编译项目时才能运行目标任务(换句话说,我认为没有跳过CoreCompile目标)。
答案 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
,您的目标将无法运行(例如,因为输出程序集已经与代码相关了。)