11

我們在多個軟件項目中使用single master solution strategy,最近有人在通用代碼中添加了一個依賴項,這會破壞另一個項目的解決方案,直到新的依賴項添加到他們的解決方案中。什麼是消除或最小化這類問題的好策略?如何在添加依賴關係時自動更新主解決方案?

我們認爲以下幾點:多分區解決方案

  • 添加關鍵字來簽入日誌消息告訴其他項目添加依賴(但這是一個手動過程)
  • 工作而不是單一的主解決方案(導致構建時間更長,解決方案中的智能感知喪失等)
  • 使用工具從多個分區解決方案創建主解決方案(可以使用VS2015的任何建議?)

迄今爲止,我們最大的單一主解決方案是115個項目文件,所以在此基礎上,似乎並不需要劃分解決方案,除非這是解決我們問題的最佳方法。

如果你遇到過這個問題,你是如何解決它的?

+0

什麼語言? C++?您可以使用項目引用,它們是項目文件的一部分,而不是解決方案文件,因此每個使用該方案的解決方案都會自動獲取參考。 – stijn

+0

是的,C++。我們使用引用,但是如果引用的項目不在解決方案中,是否有辦法告訴Visual Studio繼續構建它? – traal

+1

我很確定沒有內置的方式。你可以用一個msbuild目標創建一個文件,它只是建立它所看到的所有項目引用,然後將這個文件包含在你擁有的所有項目中。幾乎完美的是,它並不是說它仍然不會構建,例如,解決方案A中沒有任何更改,但是解決方案A之外的項目中的源文件發生更改,因爲A不會檢測到它自己的項目的任何更改。這可能也可能是固定的,但這已經很難了。無論如何:我選擇的解決方案是使用CI設置,因此任何構建破損都會被發現:] – stijn

回答

2

可能沒有內置的方法來執行此操作(任何版本的VS安裝的MSBuild文件都不會執行該項目的構建,並且其功能請求爲like this one)。一個非常快速的解決方案是創建一個msbuild文件,該文件將引用的項目構建爲預構建事件,並將該文件包含在引用另一個項目的每個項目中。例如,在共同構建工具左右目錄下創建一個名爲文件buildprojectreferenecs.targets,與內容

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Target Name="BuildProjectReferences" BeforeTargets="BuildGenerateSources"> 
    <MsBuild Projects="@(ProjectReference)" 
      Properties="Configuration=$(Configuration);Platform=$(Platform)"/> 
    </Target> 
</Project> 

這只是構建具有相同配置和平臺項目,包括它的每個ProjectReference。在使用項目引用的每個項目中導入。導入必須在定義了ProjectReference項目後進行,因此請將其放入

... 
    <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <!-- this is near the bottom already --> 
    <Import Project="..\BuildProjectReferences.targets" /> !<-- add this --> 
    ... 
</Project> 

現在,如果你運行構建,實際編譯開始之前會發生引用的項目的生成(反過來他們引用的項目等),不管他們是:在底部一路該解決方案與否。一些缺點:

  • 如果添加一個項目refernce卻忘了導入此文件沒有任何反應
  • 構建無條件地發生,所以如果參考項目已經建成了構建再次啓動;雖然它也會立即完成,因爲構建系統發現所有輸出都是最新的
  • VS中的構建系統將無法檢測到解決方案之外的引用項目的更改,因此如果解決方案中的所有項目都是最新的,並且在不會構建的解決方案之外更改引用項目中的源文件。儘管命令行構建不是這樣,但是會有一個項目的構建開始,因此也會構建引用的項目。

總而言之,我不知道它是否值得。由於您選擇了「單主解決方案」方法,可以說解決方案應該是項目的單一解決方案,因此必須包含從源構建的所有依賴關係。開發者的任務就是確保這一點。爲了趕上失敗這麼快,最好的解決方案是建立一個構建服務器,它將每個提交構建到代碼庫,並且因此可以快速發現錯誤。然後開發人員會通知他們的錯誤,並且很快就會應用這個修補程序(特別是因爲它很簡單)。