2011-04-19 66 views
1

我需要讓解決方案中的所有項目都包含一些額外的構建操作,例如, StyleCop驗證,AssemblyInfo的自動化等。如何根據一些標準檢查解決方案中的所有項目?

我的想法是做出某種解決方案範圍的預構建事件,該事件將檢查包含與特定xPath匹配的節點的所有項目文件。這不是一個困難的部分,它可以通過自定義構建任務或使用某些第三方Xml處理任務來解決。我還沒有深入調查過,但在這裏絕對不會有值得一提的問題。

問題是如何
1)使用一些自定義任務擴展解決方案文件?它不應該是解決方案的組成部分。這是需要的,但可以在從VS構建時省略,只需執行一些特定的命令行即可。 2)如果不可能,在「Solution-wide pre-build event?」中描述的選項有所不同。這很黑,但如果沒有其他選擇,我會使用它。但是如何從解決方案文件中獲取項目文件列表?請注意,包含解決方案的文件夾可能包含不應檢查的額外項目文件,因此只列舉所有***。* proj不是一個選項。

P.S.任何其他選項的整個問題也歡迎:)

回答

2

您可以使用內置的MSBuild功能的任何條件,擴展功能創建的任何自定義任務:CustomAfterMicrosoftCommonTargetsCustomBeforeMicrosoftCommonTargets

查看我的example。您可以在構建過程中的每個步驟的.targets文件中添加自定義任務。您可以添加條件來打開/關閉這些操作等。它不依賴於sln文件,但是您可以擁有VS特定的任務,條件爲'$(BuildingInsideVisualStudio)'=='true'。您可以通過命令行調用它們 - 您需要使用密鑰/t指定目標的名稱:MyCustomTarget

副作用:如果您的自定義目標不會有任何特定條件 - 它將在每個類似的項目中被調用。

0

有一種更簡單的方法來處理這種事情。您可以使用通過http://msdn.microsoft.com/en-us/library/ms171464.aspx(另一個示例爲http://msdn.microsoft.com/en-us/library/ms171464.aspx)中介紹的機制導入到Visual Studio項目中的共享生成.targets文件來代替嘗試動態更改項目文件內容。

+0

也許我不清楚我的問題 - 我已經有共同的目標。我只需要檢查是否導入了目標:團隊很大,項目不是由一個人添加的。例如。我最後一次檢查顯示,在我們約50個項目的解決方案中,有7個項目不導入該自定義目標。我想自動執行此檢查。 – 2011-04-19 16:56:22

0

我從來沒有從解決方案級別解決這個問題 - 當您針對解決方案文件調用msbuild時,您沒有太多的控制權。

相反,我通常通過讓解決方案中的每個項目導入另一個包含所有常見目標的msbuild文件來解決這個問題。由於您提到解決方案中的每個項目都不需要完成所有額外的任務,因此這可以讓您對每個項目將執行的操作有很好的控制。

<Import Project="_pathToCommonTargets_" /> 

導入共同的目標後,你可以控制用鉤子發生什麼事到構建項目 - 即,當「構建」之稱的該項目的特定點進行覆蓋的目標。此外,您可以在公用目標文件中創建新的目標,您可以調用該目標而不是構建目標,因爲當您在Visual Studio之外構建時。

<Target Name="AfterBuild" > 
    <!-- Other tasks here --> 
    <!-- Calling a common target --> 
    <CallTarget Target="_commonTargetName_" /> 
</Target> 

此外,我不會推薦使用類似XPath的東西來確定每個項目文件中的節點。使用msbuild中包含的功能將會更加清潔。例如,您可以檢查屬性是否被設置(的PropertyGroup節點的兒童)和對藏品進行操作(的ItemGroup節點的孩子。)

+0

同樣,我的問題似乎並不清楚:我不需要添加自定義構建目標(或者實際上我做了,而我已經這樣做了),我只需要檢查它們是否已經導入。這樣我也無法檢查屬性設置 - 所以我會檢查未加載的項目。 – 2011-04-19 17:07:53

相關問題