2009-08-07 25 views
259

什麼只是一個之間的差別重建並做了清潔 + 在Visual Studio 2008中構建?是Clean + Build不同然後做Clean + 重建差異重建和在Visual Studio清潔+構建

+4

[這裏是一個不錯的職位,詳情](http://conceptf1.blogspot.com/2013/11/visual-studio-clean-build-and-rebuild-solution.html) – 2013-11-21 08:36:01

回答

268

重建=清潔+構建

值得注意的細節:

  1. 對於多項目解決方案,「重建解決方案」做一個「乾淨」的後面是「建」爲每個項目(可能在平行下)。鑑於「清潔解決方案」後跟「構建解決方案」首先清理所有項目(可能並行),然後構建所有項目(可能並行)。當項目間依賴關係發揮作用時,事件排序的這種差異可能變得顯着。

  2. 所有這三個操作都對應於MSBuild目標。所以一個項目可以重寫重建動作來完成一些完全不同的事情。

+1

所以你說* Rebuild * **完全**與* Clean *相同,然後是* Build *?這是我的想法,但我不確定。 – 2009-08-07 23:50:39

+40

除重建清理和逐個重建每個項目外。清潔+構建清理所有這些,然後構建所有這些。大多數情況下,如果你點擊它,會造成差異:) – Eugene 2009-08-08 03:35:07

+22

除了沒有保證它們是相同的。請參閱下面的JaredPar的答案,與Earl的結合是整個畫面。 因爲Rebuild輪流執行每個項目,所以當依賴信息混亂並且使用舊項目A得到B的無序生成項目時,可以有一個「角落案例」,然後重建A,然後重建C.等。 。完整的解決方案Clean和完整的解決方案構建將在重建時不會出現這種情況。所以你越是偏執和厭倦,你越應該傾向於Clean Clean Build。 – 2010-01-12 17:44:27

154

厄爾是正確的99%的時間重建=清潔+生成。

但他們不保證是相同的。 3個動作(重建,構建,清理)表示不同的MSBuild目標。每個項目文件都可以被任何項目文件覆蓋以執行自定義操作。因此,在啓動一個clean + build(或者完全刪除它)之前,完全可以讓某人覆蓋重建以執行多個操作。

非常多的角落案件,但由於評論討論指出。

+0

如果添加將生成的.dll文件移動到新位置的構建操作,則只需執行重建即可生成「錯誤」生成結果。 如果你將vb.net和c#項目混合在一起,事情會變得更糟糕,破壞​​設計師並且無法實現。 – CodingBarfield 2010-08-24 07:11:00

+0

+1還請注意,重建行爲在各種語言方面對於依賴關係似乎並不一致:http://stackoverflow.com/questions/12163080/vs2010-lnk1181-when-rebuilding-project-with-dependency – lesscode 2012-08-28 19:02:52

12

http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm,(只是GOOGLE了它):

構建意味着編譯和鏈接只有自上次編譯後更改過的源文件,而重建手段編譯也不管鏈接他們是否改變了所有的源文件或不。構建是正常的事情,速度更快。有時,項目目標組件的版本可能會不同步,重建對於構建成功是必要的。在實踐中,你永遠不需要清潔。

構建或重建解決方案構建或重建解決方案中的所有項目,而構建或重建將在上面的屏幕截圖中構建或重建StartUp項目「hello」。要設置啓動項目,請右鍵單擊解決方案資源管理器選項卡中所需的項目名稱,然後選擇設爲啓動項目。項目名稱現在以粗體顯示。由於作業解決方案通常只有一個項目,所以Build或Rebuild Solution實際上與Build或Rebuild相同。

編譯只編譯當前正在編輯的源文件。當其他源文件處於不完整狀態時可以快速檢查錯誤,從而防止整個項目的成功構建。 Ctrl-F7是Compile的快捷鍵。

44

1每個項目,重建項目=(清理項目+生成項目)。

2 Per Solution,Rebuild Sln = foreach project(Clean project + Build project)!= Clean Sln + Build Sln

假設你有一個Sln,它包含proj1,proj2和proj3。

重建SLN =(清潔proj1 - >構建Proj1)+(清潔proj2 - >構建Proj2)+(清潔proj3 - >構建Proj3)

清潔SLN +構建SLN =(清潔proj1 +清潔proj2 +清潔proj3) - >(編譯proj1 +構建proj2 +構建proj3)

- >表示串口,+意味着併發

所以當你提交了大量的代碼更改的機會,而你沒有配置做正確的項目依賴關係,重建Sln會導致你的一些proj鏈接到一個陳舊的lib,因爲所有的構建都不能保證在全部清除之後(在這種情況下,Cl EAN SLN +構建SLN會給出一個鏈接錯誤,並讓你知道,馬上的,而不是給你用奇怪的行爲的應用程序)

+6

This one是最準確的答案,因爲它解釋了爲什麼有時我無法重建,但能夠清理+構建。 – 2012-06-27 01:23:12

3

this blog post,作者鏈接爲a comment on this question

其實也沒什麼! !他們不平等。

不同之處在於順序項目變得乾淨和構建。假設 表示我們在解決方案中有兩個項目。清理然後編譯將 執行清理這兩個項目,然後構建將單獨發生 而重建項目A將得到並清理,然後構建 項目B將清理,然後構建等。

相關問題