2013-03-15 154 views
0

msbuild和Visual Studio似乎不同地解決項目依賴關係:解決方案文件包含主可執行文件的項目,以及一些可執行文件依賴的dll項目。其中一個dll項目取決於另一個不屬於解決方案的項目。解決依賴項目

只是爲了顯示在這種情況下的主要參與者,以及一個簡單的方法來複制它: 解決方案包含ExeProject和MainDllProject,MainDllProject取決於SubDllProject這不是解決方案的一部分(但在文件系統上的相同層次)。 ExeProject取決於MainDllProject的MainDllProjectClass1(即類不依賴於SubDllProject;只有MainDllProjectClass2取決於SubDllProject,但它不使用ExeProject也不MainDllProjectClass1):

Solution 
    ExeProject 
     Form1 (depends on MainDllProject.MainDllProjectClass1) 
    MainDllProject 
     MainDllProjectClass1 
     MainDllProjectClass2 (depends on SubDllProject.SubDllProjectClass) 
Not part of the solution 
    SubDllProject 
     SubDllProjectClass 

當解決方案建立與Visual Studio 2010年,失敗:無法建立MainDllProject,因爲無法找到SubDllProject。

當解決方案使用msbuild構建時,構建成功。奇怪的是,無論參數/ p:Configuration = Release,SubDllProject的調試版本都是內置的。

msbuild的日誌文件大約是374 kB,你有一些提示如何分析它嗎?我想理解它爲什麼構建SubDllProject,爲什麼它是調試版本,並且如何防止在未引用時構建SubDllProject(我希望解決方案包含所有引用的項目,並且當某個依賴項被遺忘時,我希望看到一條錯誤消息)。

注:這種情況下,類似於Visual studio build non-dependent projects in solution,但相當反過來... 我從http://blogs.msdn.com/b/visualstudio/archive/2010/12/21/incorrect-solution-build-ordering-when-using-msbuild-exe.aspx理解的MSBuild轉換SLN的文件轉換成自己的格式 - 但sln.metaproj文件沒有顯示任何參考SubDllProject要麼。

回答

0

對,我剛剛經歷了一個非常類似的問題。
我們在版本控制的同一目錄中有一堆解決方案,其中一些共享項目。我們在解決方案1中將項目A更改爲參考項目B,但忘記了解決方案2也使用項目A,但不包括項目B.

msbuild碰巧找到項目B,因爲路徑參考已解析爲一個真實的東西,但顯然沒有在解決方案中構建它的說明,所以使用默認值(調試)。

長話短說;如果您有多個解決方案項目引用多個共享項目,請確保所有解決方案都具有所有項目。