2011-03-07 74 views
0

任何人都可以告訴我,MsBuild是如何獲得財產的價值?MS Build屬性層次結構如何維護?

例如。

<TempProperty>Property Value</TempProperty> 

現在我可以在任何地方使用$(TempProperty)來獲取它的值。

有這樣的配置現在情況是我已經自定義任務..

<PropertyGroup> 
    <ItemList> 
     <ConfigChange> 
     <PlaceHolder>#MACHINE_NAME#</PlaceHolder> 
     <Value>$(TempProperty)</Value> 
     <IsList>False</IsList> 
     </ConfigChange> 
    </ItemList> 
    </PropertyGroup> 
現在

,而不是在我得到$(TempProperty)...誰能標籤越來越「屬性值」告訴我如何在標籤中獲得實際價值?

在此先感謝。

嘿,夥計們我也得到了實際的問題和解決方案......我想我無法在這裏描述我的問題..問題是..在我的自定義任務中,我傳遞了文件路徑包含上面的ItemList標記的文件..當我試圖解析XMLNode「ItemList」時,它得到「$(TempProperty)」作爲Item中的值..我認爲這是正確的,因爲那就是傳入的XML中存在的內容。

所以要克服這個問題,我做了兩件事..

我創建的ItemGroup代替的PropertyGroup並通過了的ItemGroup到我的自定義任務,而不是文件路徑。因此現在我的代碼我得到想要的值。

感謝您的回覆。

+0

您應該將答案添加爲詳細答案,並將問題標記爲已解決。 –

回答

0

對Ritch的建議我正在添加我的解決方案。

起初我

<TempProperty>Property Value</TempProperty> 

<PropertyGroup> 
    <ItemList> 
     <ConfigChange> 
     <PlaceHolder>#MACHINE_NAME#</PlaceHolder> 
     <Value>$(TempProperty)</Value> 
     <IsList>False</IsList> 
     </ConfigChange> 
    </ItemList> 
    </PropertyGroup> 

我現在的問題是,我提供我的屬性文件的一部分到我的自定義任務

<UpdatePegasusConfigXML 
     Environment="$(Environment)" 
     Instance="$(Instance)" 
     BuildSourceRoot="$(BuildSourceRoot)" 
     ></UpdatePegasusConfigXML> 
現在

,因爲我提供的文件路徑本身,以便它採用了放在「Value」標籤中的值,而不是拾取屬性值,因此在代碼級別,我得到了「$(TempProperty)」而不是「屬性值」

現在我所做的,而不是建立財產組,我創建的ItemGroup這樣

<ItemGroup> 
    <PlaceHolders Include="#MACHINE_NAME#"> 
     <Value>$(TempProperty)</Value> 
     <IsList>True</IsList> 
    </PlaceHolders> 
</ItemGroup> 

現在我更新了我的自定義任務採取IteamGroup作爲一個輸入,從而調用改爲

<UpdatePegasusConfigXML 
     Environment="$(Environment)" 
     Instance="$(Instance)" 
     BuildSourceRoot="$(BuildSourceRoot)" 
     PlaceHolders="@(PlaceHolders)" 
     ></UpdatePegasusConfigXML> 

現在在代碼級別我能夠獲得ItemGroup的「Value」標記中的值。

我希望我解釋了我的解決方案,這是可以理解的。

0

沒有足夠的真正診斷您的問題。乍看起來看起來正確,但TempProperty的PropertyGroup在哪裏聲明?

對於一個示例是,這裏是從C#項目文件的一個片段:

 <?xml version="1.0" encoding="utf-8"?> 
    <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
     <PropertyGroup> 
       <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
       ... 
     </PropertyGroup> 

     <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
      ... 
     </PropertyGroup> 

配置屬性被設置爲調試(如果是空白的,在該點處)。在下面的組中,它關閉了Confuration和Platform屬性。

唯一的問題是要讓屬性值正確顯示,必須在使用它之前聲明。

請嘗試提供更多的上下文,這可能有助於理解問題。

0

我只是嘗試這樣做:

<Project 
    xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
    ToolsVersion="4.0" 
    DefaultTargets="Demo" > 

    <PropertyGroup> 
    <TempProperty>property value</TempProperty> 
    <ItemList> 
     <ConfigChange> 
     <PlaceHolder>#MACHINE_NAME#</PlaceHolder> 
     <Value>$(TempProperty)</Value> 
     <IsList>False</IsList> 
     </ConfigChange> 
    </ItemList> 
    </PropertyGroup> 



    <Target Name="Demo"> 
    <Message Text="TempProperty: $(TempProperty)"/> 
    <Message Text="ItemList: $(ItemList)"/> 
    </Target> 


</Project> 

我的結果,其中:

Task "Message" 
    TempProperty: property value 
Done executing task "Message". 
Task "Message" 
    ItemList: 
    <ConfigChange xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PlaceHolder>#MACHINE_NAME#</PlaceHolder> 
    <Value>property value</Value> 
    <IsList>False</IsList> 
    </ConfigChange> 
Done executing task "Message". 

你看到別的東西?

+0

我想我不清楚..我得到的價值,因爲你已經表明......但在我的自定義邏輯,當我選擇XMLNode「ItemList」,那麼我沒有得到所需的價值,而是我越來越......「 $(TempProperty)「作爲值... – Sumit

相關問題