2013-02-05 33 views
0

我遇到了一些msbuild文件的問題。在啓動時檢查一個屬性,具體取決於選定的目標

我想構建有三個目標,在這個順序執行:

  • Cleanup:清理上次構建
  • Build的輸出:實際構建
  • CopyFiles:任務打包生成的輸出更容易部署

現在的問題是:我想要一個屬性(ReleasePath)fo r由調用者明確設置的CopyFiles目標。另外,如果只調用CleanupBuild任務,則調用者不必設置輸出路徑。

我第一次嘗試一直是:

<PropertyGroup> 
    <ReleasePath></ReleasePath> 
</PropertyGroup> 

<Target Name="Initialize"> 
    <Error Text="The ReleasePath property isn't defined" Condition="'$(ReleasePath)' == ''"/> 
</Target> 

<Target Name="CopyFiles" DependsOnTargets="Initialize"> 
</Target> 

它工作正常,但CopyFiles前右Initialize目標執行,即Build後。 Build目標可能需要很長時間才能執行,因此如果出現問題,我希望立即通知用戶。

所以基本上,有沒有辦法在開始時運行Initialize目標,但只有在目標中包含CopyFiles時纔有效?

我也想過把Initialize項目的InitialTargets屬性,然後把一個條件只有CopyFiles選擇執行這一目標,但讓我吃驚我找不到包含目標列表中選擇一個屬性由來電者。

回答

0

我認爲最簡單的方法來實現您的目標將是使用屬性來切換CopyFiles而不是傳入的目標列表。如果您總是將CopyFiles添加到AfterBuild目標但條件它的屬性,如「ShouldCopyFiles」那麼你也可以實現條件構建的DependsOnTargets:

<PropertyGroup> 
    <ShouldCopyFiles Condition="'$(ShouldCopyFiles)'==''">false</ShouldCopyFiles> 
    <ReleasePath></ReleasePath> 
</PropertyGroup> 

<PropertyGroup> 
    <BuildDependsOn> 
    BeforeBuild; 
    CoreBuild; 
    AfterBuild; 
    CopyFiles; 
    </BuildDependsOn> 

</PropertyGroup> 

<PropertyGroup Condition="'$(ShouldCopyFiles)'=='true'"> 
    <BeforeBuildDependsOn> 
    Initialize; 
    </BeforeBuildDependsOn> 
</PropertyGroup> 

<Target Name="Initialize" Condition="'$(ShouldCopyFiles)'=='true'">CheckStuff 
</Target> 

<Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/> 

<Target Name="CoreBuild">YourBuildStuff</Target> 
<Target Name="BeforeBuild" DependsOnTargets="$(BeforeBuildDependsOn)"/> 
<Target Name="AfterBuild" /> 

<Target Name="CopyFiles" Condition="'$(ShouldCopyFiles)'=='true'"> 
    CopyStuff 
</Target> 

在這一點上,你可以調用的MSBuild是這樣的:

msbuild my.proj /targets:Clean;Build /p:ShouldCopyFiles=true 

,並且將其啓用。

+0

我一直希望有一些魔術來避免添加另一個屬性,但我擔心你是對的。謝謝! –

相關問題