2009-09-03 52 views
11

如何讓一個構建目標中定義的值保持在其他targert中?如果PropertyGroup不是我在此使用的寫入MsBuild實體,那麼是什麼? RELEASEDIR被印在「包」目標確定,但在「DoPackage」空將屬性組的值從一個MsBuild任務傳遞到另一個

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDirBase> 
    </PropertyGroup> 
    <Message Text="$(ReleaseDir)"/> 
    <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleaseDir)')"/> 
</Target> 

<!-- Do the acutal packaging --> 
<Target Name="DoPackage"> 
    <Message Text="Creating package in '$(ReleaseDir)'"/> 
    <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleaseDir)"/> 
    ... 
</Target> 

回答

21

有一個well known issue與性能和CallTarget任務。您應該使用DependsOnTargets。

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDir> 
    </PropertyGroup> 
    <Message Text="$(ReleasesDir)"/> 
</Target> 

<Target Name="PrePackage" DependsOnTargets="Package"> 
    <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleasesDir)')"/> 
</Target> 

<!-- Do the actual packaging --> 
<Target Name="DoPackage" DependsOnTargets="Package"> 
    <Message Text="Creating package in '$(ReleasesDir)'"/> 
    <Error Condition="'$(ReleasesDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleasesDir)"/> 
</Target> 
+0

我想只有在ReleaseDir存在的情況下才運行DoPackage(我在CallTarget中使用Condition來實現此目的)。我可以使用DependsOnTarget來實現嗎? – ripper234 2009-09-03 15:02:31

+0

現在我已經閱讀了您發佈的鏈接,解決方案很簡單 - 我編寫了一個名爲「DefineProperties」的單獨任務,完成後屬性被...定義。謝謝。 – ripper234 2009-09-03 15:15:20

+0

是的,這是解決方案,我已經更新了示例。 – 2009-09-03 15:19:56

1

如果想傳遞一個屬性設置爲一個目標時,MSBuild任務可能是有用的。這是使用不同屬性值多次調用目標的唯一方法,但不允許傳遞項目或項目組。在Julien鏈接的主題中查看comment

... [C]所有的MSBuild目標在它上面,這次傳入所需的屬性。這會繞過增量構建...,但有很多限制,即無法傳遞項目,並且必須指定需要傳遞哪些屬性。

這裏是您的代碼段會是什麼樣使用MSBuild任務:

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDir> 
    </PropertyGroup> 
    <Message Text="$(ReleaseDir)"/> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="DoPackage" Properties="ReleaseDir=$(ReleaseDir)" /> 
</Target> 

<!-- Do the acutal packaging --> 
<Target Name="DoPackage"> 
    <Message Text="Creating package in '$(ReleaseDir)'"/> 
    <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleaseDir)"/> 
    ... 
</Target> 

,如果你想使用的目標作爲一個子程序,您可以用不同的呼叫多次,這種技術是非常有用的參數值。例如,爲多個產品配置調用構建過程。

1

它可能不是解決這個問題的最乾淨的方式,但如果有一個人希望繼續使用CallTarget在構建文件,他/她必須在另一目標定義的PropertyGroup,以下是解決這一奇怪的問題。

<Target Name="DebugBuild" DependsOnTargets="DebugBuildProp"> 
    <CallTarget Targets="CompileSolution"/> 
</Target> 
<Target Name="DebugBuildProp"> 
    <PropertyGroup> 
    <Configuration>Debug</Configuration> 
    </PropertyGroup> 
</Target> 
<Target Name="CompileSolution"> 
    <Message Text="$(Configuration)" /> 
</Target> 
+0

如果' CompileSolution'仍然不會使用新的值。 – makhdumi 2015-10-29 23:53:54

+0

@ Al-Muhandis實際上,我不知道爲什麼,但是如果你在依賴目標上定義屬性,那麼你使用CallTarget調用的所有其他目標都將具有該值。親自嘗試一下 – 2015-10-30 06:00:59

相關問題