Visual Studio项目 - MSBuild目标 - AfterBuild - Condition - 只有在二进制文件更新时

4

我在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>

你可以查看以下链接:https://dev59.com/GUbRa4cB1Zd3GeqP0nYb - Adriano Repetti
是的,看起来答案就在链接里,我会进一步调查。 - Simon
无法理解链接中的答案,我觉得我漏掉了什么。实际上,我想要做的就是在项目构建并将文件写入 bin 目录时运行一些 ms build 任务。 - Simon
2个回答

5

选项1: 使用MSBuild的另一个未记录特性AfterRebuild代替AfterBuild

<Target Name="AfterRebuild" >...</Target>

选项2:
连接增量构建的条件之一:
<Target Name="AfterBuild" Condition=" '@(_SourceItemsToCopyToOutputDirectory)' != '' " >

更新:

使用MSBuild Extension PackILMerge任务可以更好地控制,例如检查每个文件是否存在:

<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>

好的,我尝试了两种方法,但结果都有些奇怪。第一种似乎根本没有触发,而后一种则不总是能够触发。例如,如果我添加了一些代码并按下Shift+F6(构建当前项目),它仍然无法运行。 - Simon
第一个应该在“Rebuild”上运行;第二个是在输出文件发生更改时运行。这不是你要求的吗?如果不是,请澄清你的问题。 - KMoraz
感谢您的时间,是的,那是我的要求,但缺少的是我正在使用Visual Studio,如果您在Visual Studio中尝试这些操作,它们不会像预期的那样运行。我刚刚对DLL进行了大量更改,并使用上述条件指定的目标AfterBuild,但即使有11个文件被复制到bin文件夹中,它也无法执行。我甚至尝试删除bin文件夹中的所有文件,它仍然无法在构建时执行目标。有什么想法吗? - Simon
我建议避免使用<Exec>任务。请查看我的更新答案,其中涵盖了使用MSBuild扩展包进行托管方式的方法。 - KMoraz
感谢提供的ILMerge任务,实现起来看起来更加简洁。在我的事件触发期间,我将ILMerge从目标中移除了,所以我仍然有一个问题,即在Visual Studio中的目标未按预期触发。如果我执行“全部重新生成”操作,可以使重建目标触发,但这违背了我的初衷,我希望只在文件更改时精细控制目标触发。我快要放弃了,只想使用单独的批处理文件来执行合并操作,当构建类型为Release时添加条件。 - Simon
选项2很好用。我已经花了两个小时在这上面了。不知道为什么它如此晦涩。 - Rob Lyndon

-2

如果您的意思是在“属性”>>“生成事件”>>“运行后生成事件”中有一个ComboBox,那么是的。


谢谢您花时间回答,但那不是我要找的答案。 - Simon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接