2012-02-28 40 views
3

我有一个很长的afterbuild过程后,我的Visual Studio项目文件的构建目标后,如下所示。Visual Studio项目 - MSBuild目标 - AfterBuild - 条件 - 只有当二进制文件更新

问题是,即使当实际的源代码没有改变并且项目未被编译时,它仍然会在构建完成时运行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> 
+0

你可以看看: http://stackoverflow.com/questions/516227/suppressing-afterbuild-targets-when-a-csproj-has-not-built- – 2012-02-28 12:47:58

+0

是的,这看起来像答案是链接,将调查更多 – Simon 2012-02-28 13:02:07

+0

无法真正理解链接中的答案,我想我错过了一些东西。实际上,我想要做的就是在项目构建完毕并且文件已写入bin目录时运行一些ms构建任务。 – Simon 2012-02-28 14:00:59

回答

-2

在性质组合框>>生成事件>>运行生成后事件......如果这是你的意思。

+0

感谢您抽出时间,但这不是我正在寻找的答案。 – Simon 2012-02-28 13:04:18

4

选项1: 代替AfterBuild使用AfterRebuild(的MSBuild的众多无证特征中的一个):

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

选项2:

钩向上的incremental build的条件之一:

<Target Name="AfterBuild" Condition=" '@(_SourceItemsToCopyToOutputDirectory)' != '' " > 

UPDATE

使用MSBuild Extension PackILMerge task将允许更好的控制,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> 
+0

好吧,尝试两个奇怪的结果,第一个似乎并没有开火,后来并不总是会触发,例如,如果我添加一些代码并点击F6(建立当前项目),它仍然不会运行。 – Simon 2012-02-28 16:55:07

+0

第一个应该在'重建'上运行;第二次输出文件发生变化时。这不是你要求的吗?如果不是,请澄清您的问题 – KMoraz 2012-02-28 17:29:43

+0

感谢您的时间,是的,这是我的要求,但缺少的是,我使用Visual Studio,如果你在Visual Studio中尝试这些,他们不会像预期的那样行事,我只是做了一个使用上面指定的条件加载对DLL和目标AfterBuild的更改并且即使将11个文件复制到bin文件夹中也无法执行该更改?我甚至尝试删除bin文件夹中的所有文件,它仍然不会执行构建目标。有任何想法吗? – Simon 2012-03-01 12:39:38

相关问题