2011-10-17 50 views
2

我正在構建屬性表的層次結構(許多根據平臺和配置有條件地包含),並且我正在嘗試編寫一組目標來幫助診斷任何可能會潛入的錯誤。如何從MSBuild轉儲導入屬性表的列表

我想要的是已包含的屬性表列表。

例子:

<ImportGroup Condition="$(Configuration.Contains('Debug'))"> 
    <Import Project="ps.cpp.config.debug.props"/> 
</ImportGroup> 
<ImportGroup Condition="$(Configuration.Contains('Release'))"> 
    <Import Project="ps.cpp.config.release.props"/> 
</ImportGroup> 

<ImportGroup Condition="'$(Platform)' == 'x64'"> 
    <Import Project="ps.cpp.plat.x64.props"/> 
</ImportGroup> 
<ImportGroup Condition="'$(Platform)' == 'Win32'"> 
    <Import Project="ps.cpp.plat.win32.props"/> 
</ImportGroup> 

和目標是這樣的:

<Target Name="DumpPropertySheets"> 
    <!-- This doesn't work! --> 
    <!-- <Message Text="%(Import.Project)"/> --> 
</Target> 

應該導致這樣的控制檯輸出,當內置msbuild test.vcxproj /t:DumpPropertySheets /p:Platform=x64 /p:Configuration:Debug

DumpPropertySheets: 
    ps.cpp.config.debug.props 
    ps.cpp.plat.x64.props 
+0

另外,我d喜歡它,如果有人可以創建一個msbuild-batching標籤,因爲顯然我嘗試批量處理ItemGroup以外的東西顯然失敗了。我仍然認爲這是一個有用的標籤。 –

回答

1

沒有明顯方法來做你正在做的事情。導入是預處理的,以將所有內容聚合到一個文件中,它們不是數據類型,比如項目數組或稍後可以引用的屬性。

語法%(Import.Project)不起作用,因爲這種語法只對項目陣列有效,你要使用它的進口關鍵字,它是不是一個填充項數組。

另請注意,您對導入周圍ImportGroup元素的使用是可選的(可能有點冗長)。在一個MSBuild文件中的以下兩種結構是等價的...

<ImportGroup Condition="$(Configuration.Contains('Debug'))"> 
    <Import Project="ps.cpp.config.debug.props"/> 
</ImportGroup> 

...和(線包裹的清晰度)...

<Import 
    Condition="$(Configuration.Contains('Debug'))" 
    Project="ps.cpp.config.debug.props" 
    /> 

如果你試圖診斷屬性表進口錯誤,請不要忘記/ pp命令行開關,它將轉儲完整的預處理文件。你也可以(至少爲你自己的文件)給每個導入一個項目數組的唯一入口,例如

<Import 
    Condition="$(Configuration.Contains('Debug'))" 
    Project="ps.cpp.config.debug.props" 
    /> 

然後裏面ps.cpp.config.debug.props

<ItemGroup> 
    <_Import Include="$(MSBuildThisFile)" /> 
</ItemGroup> 

後來在你的構建,你可以讓你看起來是在尋找,在一定程度上有,

<Target Name="DumpPropertySheets"> 
    <!-- This does work! --> 
    <Message Text="%(_Import.Identity)" /> 
</Target> 
+0

感謝您的迴應。您在每個屬性表中定義ItemGroup的解決方案是我之前嗅探過的解決方案。目前我已經採用這種技術。儘管在我的一些實驗中,當我在導入的項目中時,$(MSBuildThisFile)屬性爲空,所以我恢復爲對文件名進行硬編碼。在我接受你的答案之前,我會等待更多的答覆,因爲我想看看是否有其他人有任何技術維護不足。 –

+0

此外,我將條件放在ImportGroup元素上而不是Import元素的原因是由於Visual Studio中報告的錯誤,它無法正確處理配置開關和條件化的導入元素。似乎條件化ImportGroup在我的環境中工作。請參閱http://msdn.microsoft.com/en-us/library/92x05xfs.aspx上的說明 –