2012-02-28 41 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

相關問題