2012-12-24 55 views
4

我有一個項目文件的集合:使用的MSBuild的PropertyGroup目標塊外

<ItemGroup> 
    <ApplicationToDeploy 
    Include="Frontend.WebSite.csproj;11.WebServices.csproj;22.WebServices.csproj"/> 
    <ApplicationToDeploy 
    Include="33.WebServices.csproj;44.WebServices.csproj;Workflow55Svc.csproj"/> 
</ItemGroup> 

我試圖讓這些項目的.config-文件的集合:

<Target Name="111"> 
    <PropertyGroup> 
    <Cfgs>@(ApplicationToDeploy->'%(RootDir)%(Directory)*.config')</Cfgs> 
    </PropertyGroup> 

    <ItemGroup> 
    <InputConfigs Include="$(Cfgs)" /> 
    </ItemGroup> 

    <Message Text="Cfgs: @(InputConfigs)"/> 
</Target> 

裏面的目標阻止所有工作正常(我看到Web.Configs,App.Configs,Log4net.Configs等的集合):

Cfgs: C:\Sources\WebServices\11\WebServices\11.WebServices\Web.config;C:\Sources\WebServices\22\WebServices\22.WebServices\web.log4net.config;C:\Sources\WebServices\33\WebServices\33.WebServices\web.environment.config 

但我想初始化這個的ItemGroup目標塊。就像這樣:

<PropertyGroup> 
    <Cfgs>@(ApplicationToDeploy->'%(RootDir)%(Directory)*.config')</Cfgs> 
</PropertyGroup> 

<ItemGroup> 
    <InputConfigs Include="$(Cfgs)" /> 
</ItemGroup> 

<Target Name="111"> 
    <Message Text="Cfgs: @(InputConfigs)"/> 
</Target> 

當我這樣做的目標塊外,我得到這樣的:

Cfgs: C:\Sources\WebServices\11\WebServices\11.WebServices\*.config;C:\Sources\WebServices\22\WebServices\22.WebServices\*.config;C:\Sources\WebServices\33\WebServices\33.WebServices\*.config 

我不明白有什麼會發生。是否有可能獲得外目標塊相同的結果?

回答

4

我不明白有什麼會發生。

此行爲是MSBuild evaluation order的效果:

期間構建的評估階段:

  • 屬性中定義和在它們 出現的順序進行修改。屬性函數被執行。形式 $(屬性名)屬性值表達式中擴展。屬性值 設置爲擴展表達式。
  • 項定義中定義並且在它們出現的順序進行修改。屬性函數已經在表達式中擴展了。元數據值設置爲擴展表達式。
  • 項目類型被定義並且在它們出現的順序進行修改。以@(ItemType)的形式展開項目值。物品轉換也擴大了。屬性函數和值已經在表達式中擴展了。項目列表和元數據值設置爲擴展表達式。

期間構建的執行階段:

  • 屬性和目標 內定義的項目以它們出現的順序被評估在一起。屬性 函數被執行並且屬性值在 表達式中被擴展。項目值和項目轉換也被擴展。 屬性值,項目類型值和元數據值設置爲 擴展表達式。「

有該鏈接上的另一個關鍵點‘(...)字符串擴張依賴於構建階段。’

您使用屬性‘CFGS’遞歸地圖你的項目的文件夾並定義一個通配符來配置文件(*.config)。當你定義'Cfgs'INSIDE目標時,InputConfigs接收Cfgs的擴展值(以分號分隔的字符串文件夾列表),然後解析通配符。另一方面,當您在目標外定義'Cfgs'時,InputConfigs會接收Cfgs的未擴展值(@(ApplicationToDeploy->'%(RootDir)%(Directory)*.cs')。當InputConfigs擴展它時,它會產生分號分隔符編輯字符串的文件夾列表,但它不能解決通配符(*.config)

是否可以在目標塊外得到相同的結果?

我認爲InputConfigs應該總是接收擴展的目錄列表。擴展在構建的執行階段進行。在此階段,只評估目標中定義的 屬性和項目。所以,我會在「初始化」目標塊中保留所有初始化。我並不是說不可能在目標區塊之外進行,但出於上述原因,這似乎不合邏輯。 =]

希望這有助於

+0

感謝,我現在 –