2009-10-13 110 views
3

我已經繼承了由幾個項目組成的解決方案,它是VB.NET和C#的混合體。它使用IDE「Build Solution」按鈕進行構建。它不會使用「msbuild foo.sln」從命令行構建;該錯誤消息表明項目A(引用項目B)找不到項目B.事實上,在使用「msbuild」並在使用IDE之後將其與內容進行比較後,檢查「bin」文件夾的內容時,我可以發現很多缺失的DLL,包括B.dll。爲什麼VS2008版本與msbuild相同的解決方案有所不同?

簡而言之:項目A 確實有一個參考項目B,但B.DLL只複製到A的bin目錄使用IDE時,但不是使用msbuild時。如果我在IDE構建後運行msbuild,它會起作用,因爲複製了引用的DLL。

我曾天真地認爲「msbuild foo.sln」與foo.sln的IDE版本相同。這似乎並非如此。關於Stack Overflow,至少有三個類似的問題,但我不能引用它們,因爲「新用戶只能發佈一個超鏈接」(!!)。抱歉。這裏有問題的標題,所以你可以搜索自己:

現在,這裏是我的問題:

  1. 在何處可以找到準確記錄什麼的Visual Studio確實當你 「生成解決方案」?
  2. 什麼是配置Visual Studio和持續集成服務器(例如Hudson)的最佳實踐,以便開發人員工作站的構建與CI構建相同?

我是從UNIX世界,所以覺得免費送我的新手指針。

回答

0

在我看來,你應該建立你的CI腳本和一般的構建腳本與msbuild。

儘管我認爲他們正在努力做更多,但IDE並沒有像MSBuild引擎一樣使用相同的引擎。

3

John Weldoon是正確的從Visual Studio和MSBuild構建非常相似,但有時可能會有所不同。一種情況是,VS對於參考文獻而言更加有利。假設你有三個projecta A,B和C.一個依賴於B和B依賴於C.然後在VS中,如果項目A只是引用B,那麼它的OK,但MSBuild可能會抱怨,因爲它缺少對項目C的引用。 有一些不同之處的一個重要原因是因爲VS有一個主機編譯器,用於幫助提升IDE體驗。如果您想降級IDE體驗,則可以將MSBuild屬性UseHostCompilerIfAvailable設置爲false以強制Visual Studio使用MSBuild。如

<PropertyGroup> 
    <UseHostCompilerIfAvailable>false</UseHostCompilerIfAvailable> 
</PropertyGroup> 

我不建議這樣做,但如果您絕對需要它,該選項可供您使用。

+0

至於傳遞閉包問題:我確實有項目A取決於B和C,以及項目B取決於C.仍然失敗。 –

+0

好的答案,我討厭這個事實,即visual studio不使用msbuild獨佔,它會在連續構建服務器等上創建各種問題,其中人們使用.sln文件作爲構建文件而不是手工製作自己的文件,我經常設置UseHostCompilerIfAvailable爲false,但我傾向於在提交到存儲庫之前進行最終構建時這樣做。 –

相關問題