2010-11-26 38 views
4

我有一個MSBuild腳本,只是做我需要它做的一切,除了我的後生成步驟(請參閱我問的前一個問題:MSBuild conditional Exec?)。MSBuild Post-Build

我正在做的是構建許多csproj文件,並且可選地執行構建後步驟,當且僅當項目被構建時。我不想一直執行我的後期構建步驟,否則我的最終輸出的時間戳將被不必要地修改(並且使構建過程無緣無故地耗時)。

在我的MSBuild腳本我有類似的東西,我的每個文件的csproj如下:

<Target Name="ProjectName"> 
    <MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" /> 
</Target> 

編輯: 我覺得我真正想要做的是檢測CoreCompile任務運行時爲每個項目。如果在某種情況下有某種方法可以檢查這種情況?

任何想法?

我是新來的MSBuild,所以也許我完全錯誤的軌道!

謝謝你,艾倫

回答

1

後一個簡單的解決這個問題,我沒有找到一個,最終想出一個自己的解決方案,它的工作原理,但未必是最好的解決辦法一番搜索。但是,我想與其他任何有相同問題的人分享,以便至少有一個可行的解決方案,並希望能夠爲您節省大量的人頭。

回顧一下,我想要做的是在我的項目構建完成後運行一個命令行工具,但只有在程序集更新時(即時間戳已更改)才能運行。我不想把它放到每個項目的後期構建部分,因爲我只想在後期構建發生在我們的構建服務器(而不是開發機器)上。

我沒有找到任何方式在我的主要.proj文件中進行外部操作,並且最終改變了每個.csproj文件的後期構建部分。

if '$(ExecuteCommand)' == 'true' command.exe 

這意味着,該命令將永遠不會在開發機器上執行,但是當我從我的.proj文件調用構建我可以在標誌設置爲:但是,我用if條件是這樣的前綴,它真這樣的:

<!-- Define common properties --> 
<PropertyGroup> 
    <ExecuteCommand>true</ExecuteCommand> 
</PropertyGroup> 

<Target Name="YourTarget"> 
    <!-- Build project --> 
    <MSBuild Projects="Path to project" Properties="ExecuteCommand=$(ExecuteCommand)" /> 
</Target> 

正如我所說的,我不認爲這是最優雅的解決方案,但它肯定可行,將足以爲我暫且。不過,我仍然有興趣瞭解實現這一目標的正確方法,以便我可以改進我的腳本。

謝謝你,艾倫

2

你也可以做它的基礎上的構建過程中選擇的配置。對於CI,您應該總是使用「釋放」或「生產」(你可以自己定義)

<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/> 
0

如果你可以添加以下到每個項目:

<Target Name="DoStuffWithNewlyCompiledAssembly"> 
    <Exec Command="command.exe" /> 
</Target> 

...那麼你只需要添加一個屬性:

<Target Name="Name"> 
    <MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" /> 
</Target> 

這工作,因爲有人在微軟智能在Microsoft.[CSharp|VisualBasic][.Core].targets添加下面一行在CoreCompile目標的結束(文件名取決於語言和的MSBuild/Visual Studio的版本)。

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/> 

所以,如果你在TargetsTriggeredByCompilation屬性指定目標的名字,你的目標運行,如果CoreCompile runs--如果CoreCompile被跳過你的目標將無法運行(例如,因爲輸出組件已經啓動,TO-關於代碼的日期)。