Visual Studio项目 - MSBuild目标 - AfterBuild - 条件 - 仅当二进制文件更新时

Sim*_*mon 4 msbuild visual-studio-2010

我的Visual Studio项目文件在构建目标之后有一个很长的后续构建过程,如下所示.

问题是,即使实际源代码没有更改且项目未编译,它也会在我点击构建时运行AfterBuild目标.

如何在编译项目并在磁盘上写入或更新物理二进制文件时才运行此操作?

<Target Name="AfterBuild">

 <Exec Command="&quot;$(ProgramFiles)\Microsoft\ILMerge\ILMerge.exe&quot; /copyattrs /log /target:library /targetplatform:4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /Lib:&quot;$(TargetDir)\&quot; /keyfile:&quot;$(ProjectDir)\Plugin.snk&quot; /out:&quot;$(TargetDir)\$(AssemblyName).merged.dll&quot; &quot;$(AssemblyName).dll&quot; &quot;PluginCommandCommon.dll&quot; &quot;Common.dll&quot;" />

 <Copy SourceFiles="$(TargetDir)\$(AssemblyName).merged.dll" DestinationFolder="$(ProjectDir)..\PluginPackage\bin\$(Configuration)\" />

</Target>
Run Code Online (Sandbox Code Playgroud)

KMo*_*raz 5

选项1:而不是AfterBuild使用AfterRebuild(MSBuild的许多未记录的功能之一):

<Target Name="AfterRebuild" >...</Target>
Run Code Online (Sandbox Code Playgroud)

选项2:

连接增量构建的一个条件:

<Target Name="AfterBuild" Condition=" '@(_SourceItemsToCopyToOutputDirectory)' != '' " >
Run Code Online (Sandbox Code Playgroud)

更新:

使用MSBuild Extension PackILMerge任务将允许更好的控制,IE检查每个文件是否存在:

<Target Name="ILMergeItems">
    <ItemGroup>
        <Input Include="C:\b\MSBuild.ExtensionPack.dll"/>
        <Input Include="C:\b\Ionic.Zip.dll"/>
    </ItemGroup>
    <MSBuild.ExtensionPack.Framework.ILMerge
        Condition="Exists('%(Input.FullPath)')"
        InputAssemblies="@(Input)"
        OutputFile="C:\a\MyNewAssembly.dll"/>
</Target>
Run Code Online (Sandbox Code Playgroud)