我的Visual Studio项目文件在构建目标之后有一个很长的后续构建过程,如下所示。
问题是,即使实际源代码没有更改且项目未编译,它也会在我点击构建时运行AfterBuild目标。
如何在编译项目并在磁盘上写入或更新物理二进制文件时才运行此操作?
<Target Name="AfterBuild">
<Exec Command=""$(ProgramFiles)\Microsoft\ILMerge\ILMerge.exe" /copyattrs /log /target:library /targetplatform:4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /Lib:"$(TargetDir)\" /keyfile:"$(ProjectDir)\Plugin.snk" /out:"$(TargetDir)\$(AssemblyName).merged.dll" "$(AssemblyName).dll" "PluginCommandCommon.dll" "Common.dll"" />
<Copy SourceFiles="$(TargetDir)\$(AssemblyName).merged.dll" DestinationFolder="$(ProjectDir)..\PluginPackage\bin\$(Configuration)\" />
</Target>
答案 0 :(得分:5)
选项1: 而不是 AfterBuild 使用 AfterRebuild (MSBuild的许多未记录的功能之一):
<Target Name="AfterRebuild" >...</Target>
选项2:
连接incremental build的一个条件:
<Target Name="AfterBuild" Condition=" '@(_SourceItemsToCopyToOutputDirectory)' != '' " >
更新:
使用MSBuild Extension Pack的ILMerge task将允许更好的控制,每个文件存在的I.E检查:
<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>
答案 1 :(得分:-2)
属性中有一个ComboBox&gt;&gt;构建事件&gt;&gt;运行构建后事件...如果这是你的意思。