2013-02-17 103 views
56

因此,正如標題所示,我現在擁有一個VS2010解決方案,其中包含約50個項目。如果我對沒有任何引用的「頂級」項目進行更改,那麼VS仍然會重建所有50個項目。我正在運行Visual Studio 2010 Ultimate,沒有任何附加組件。我正在使用ILMerge將所有項目合併到一個文件中。Visual Studio重建未修改的項目

我已通過檢查較低級別dll的時間戳驗證了這一點,並確定即使其代碼未被觸摸,它們確實也會重建。

我讀過所有的答覆和意見:

Visual Studio 2008 keeps rebuilding

Visual studio keeps building everything

Strange VS2010 build glitch occurs in my solution

Reasons for C# projects to rebuild in Visual Studio

但大多隻是提供有關卸載工程,加快建議建設時間,但沒有具體的t o修復。我試圖弄清楚爲什麼VS認爲這些依賴項目需要在沒有修復時重建。

我已經打開'工具>選項>項目和解決方案>構建和運行>只在運行時構建啓動項目和依賴關係'但沒有任何效果。另外,如果我只重建只有8個(in)直接依賴關係的「中級」項目,那麼即使ILMerge沒有被調用,也沒有任何依賴項目被修改,它仍然會構建全部8個項目。

謝謝大家對於您可能提供的任何見解。

新增

爲了測試一些建議,我創建了一個從無到有的新的WinForms項目。然後我在該解決方案中創建了兩個新項目。我將兩個'最低級別'項目中的所有代碼和資源(不是項目文件)複製到兩個全新項目中(我通過從資源管理器中將文件和文件夾放到Visual Studio中的項目上來完成這項工作)。

最低的項目,我們稱之爲B,沒有參考任何其他項目。下一個項目A,僅參考B。所以一旦我將所需的.NET和外部程序集引用添加到項目中,解決方案就會生成。

然後,我有了我的新WinForm項目參考A並做了完整的構建。所以裁判鏈是:

的WinForm - > - >

我然後改性的WinForm,做了標準構建(F6)。和以前一樣,Visual Studio重建了所有三個項目。

源文件在項目中的某些系統eleminiation後我發現,如果我刪除我的Resources.Designer.csResources.resx(並評論指出,利用這些資源的.Properties.Resources對象的代碼),然後的WinForm的修改將不再重建整個解決方案,只會重建WinForm

添加Resources.resxResources.Designer.cs返回項目(但留下注釋掉,這樣沒有被利用資源的引用代碼)會再次引入全力打造的行爲。

要查看我的資源文件是否已損壞,我再次刪除它們,然後創建一個新文件(通過「項目屬性」 - >「資源」)並重新添加與之前相同的資源,這是一個Excel文件。有了這個設置,完全重建仍然會發生。

然後,我刪除了單個資源,但將資源文件留在項目B中。即使沒有添加資源,但資源文件仍在項目中,完全(不需要)重建也會發生。

看起來只是將資源文件添加到(.NET 3.5)項目中會導致Visual Studio 2010始終重建該項目。這是一個錯誤或預期/預期的行爲?

再次感謝所有!

+0

能你試着用msbuild直接構建它,看看它是否仍然發生 – 2013-02-17 00:31:25

+0

我的理解是VS調用msbuild(並且一個項目基本上是一個msbuild腳本http://stackoverflow.com/questions/1497344/integrating-msbuild-into- visual -studio),所以我不確定這會改變什麼G。我懷疑我只是最終重新創建相同的構建腳本,然後從命令行運行它。有沒有直接運行msbuild的方法會有所不同?或者,也許某種方式來找出爲什麼msbuild認爲項目需要重建? – 2013-02-17 00:45:43

+0

你正在建設還是重建? – 2013-02-17 00:51:31

回答

15

雖然我不認爲這是一個解決方法,它是專門針對我的情況制定一個解決辦法...

我本來約5個項目進行的50包含一個Resources部分。這些項目總是會被重建,因此他們所依賴的任何東西也會被重建。其中的5個項目之一是一個「基地」級別的圖書館,其他48個項目被引用,因此我的項目中有96%將在每次重建時即使不需要它。

我的解決方法是使用依賴注入,接口和專用的「資源」項目。我不是讓這5個項目引用他們自己的Resources對象,而是在每個項目中創建一個接口,以提供所需的資源。然後,需要這些資源的類將需要在構造函數創建時傳入接口(構造函數注入)。

我然後創建一個單獨的「資源」項目,有一個實際的資源部分正常人一樣。該項目本身只包含資源,並且每個接口的類都需要通過接口提供這些資源。該項目將引用每個其他具有資源依賴性的項目並實現項目所需的界面。

最後,在我沒有任何引用的「頂級」項目中(以及實際構建的EXE和我的組合根目錄),我引用了「資源」項目,連接了DI,然後離開了。

這意味着每次只會重建兩個項目(「資源」和「頂層」),如果我進行部分構建(Shift-F6),則根本不會進行重建。

再次,不是一個偉大的解決辦法,但48個項目在建的每一個構建將需要大約3分鐘的時間,所以我一個交易日下跌30〜90分鐘,不用重建。重構需要一段時間,但我認爲這是一筆很好的投資。

這是一個簡化圖。請注意,爲了減少混亂,未顯示從Main.exeProj1Proj2的相關性。

Diagram of solution

採用這種設計,我可以做的Proj1Proj2構建,而不會觸發完全重建,因爲他們沒有在Resources部分的依賴。只有Main知道Resources的實現。

0

這裏是VS2010 always rebuilds solution?

回答此問題是由更改項目文件,清洗液, 手工刪除所有bin文件夾中,重新啓動Visual Studio和 重建一切就迎刃而解了。

+0

我不知道什麼是「改變項目文件」的意思,但我給了它的其餘部分沒有效果。看起來好像它可能與一個資源文件有關(參見問題的附加信息) – 2013-02-17 21:43:21

0

根據您的觀察,聽起來您已經有項目以不明顯的方式表達對其他項目的依賴項目。孤立的依賴項可能會保留在項目文件中,而不會在用戶界面中顯現。在文本編輯器中打開它後,你是否瀏覽了一個行爲不當的項目文件?檢查解決方案構建依賴關係?

如果您無法發現任何內容,請嘗試從頭開始重新創建一個項目,以查看新項目是否存在同樣的問題。如果幹淨的項目正確構建,你會知道你有不需要的依賴表達在某處。據我所知,這些必須在項目文件或解決方案文件中,除非您有makefile或其他不尋常的構建步驟。

+0

經過一些廣泛的研究後,它看起來像一個'Resources.resx'可能是這種行爲的原因。我在我的問題中添加了信息來描述我的實驗。 – 2013-02-17 21:44:22

+0

從您的新信息中不清楚您添加了.resx文件的項目。在任何情況下,在測試手動刪除測試之間的所有構建文件夾時要小心,以確保以前的剩餘文件不會影響以後的測試。 – 2013-02-17 22:14:04

+0

結果令人感到好奇,但不幸的是我沒有任何新的東西可以添加,除非我會繼續將問題縮小到最低限度(只有兩個項目而不是三個,只有新的未修改的嚮導創建的項目具有最低的所需更改重現問題等),然後查看是否有其他人可以用相同的項目文件重現問題。如果可以,請通過Microsoft Connect提交錯誤報告。 – 2013-02-17 22:14:33

12

這發生在項目有一個文件不存在的情況下。
該項目無法確定文件是否已更改(因爲它不在),因此它重建。

單純看項目中的所有文件,並搜索沒有靠近它的可擴展箭頭之一。

+0

這也是我的問題,但是在我的情況下,它旁邊有一個可擴展箭頭,因爲該文件最近已被刪除。因此,您可能需要更仔細一點才能找到導致重新鏈接的已刪除文件。 – Malvineous 2015-02-21 01:16:27

+0

如果我有7億個文件怎麼辦? – 2018-01-25 16:41:26

+0

您可以創建一個覆蓋項目文件或.filter文件的小腳本/程序,並檢查引用的文件是否存在。 – 2018-01-25 17:02:03

0

我和你有同樣的問題。 我發現它來自一些被刪除的文件。 當我從我的項目中刪除文件時,問題就沒有了。 此致敬禮。

91

打開工具 - 選項,選擇項目和解決方案 - 建立和運行的樹,然後設置「MSBuild項目生成輸出的詳細程度」來診斷。 這將輸出爲建設項目的原因,即

項目「ReferencedProject」不是最新的。項目'c:\ some.xml'具有'複製到輸出目錄'屬性設置爲'始終複製'。

項目'MyProject'不是最新的。在輸出文件'c:\ MyProject.pdb'後修改輸入文件'c:\ ReferencedProject.dll'。

在這種情況下,解決方法是僅在更新的情況下複製some.xml。

構建前和構建事件也可以觸發構建。

+23

我相信這是最好的答案,因爲它可以讓你真正瞭解造成構建重複的原因,而不僅僅是猜測或試驗。 – 2015-05-19 14:56:10

+0

很高興知道!我在徘徊,爲什麼一個項目重建也重建所有引用的項目。診斷日誌記錄解釋:'Target'CleanReferencedProjects:(TargetId:8)「':) – FrankyHollywood 2015-07-02 08:56:31

+0

非常有用的提示,謝謝! – 2015-12-21 17:38:08

0

對於這個類別的構建問題的MSBuild輸出詳細程度設置爲「診斷」確實是必要的第一步。大多數情況下,重新構建的陳述原因足以採取行動,但偶爾MSBuild會錯誤地聲稱某些文件被修改並需要被複制。

如果是這種情況,您需要禁用NTFS隧道或將輸出文件夾複製到新位置。 Here it is in more words.

4

在我的情況下,罪魁禍首是一個被引用的dll設置爲真的「複製本地」設置和「複製到輸出目錄」設置文件設置爲始終複製。

9

我有同樣的問題在2015年VS

什麼做的把戲對我來說是:

  1. 一個項目引用自身複製在其他一些項目斌(魔術,是)。當切換到診斷構建輸出時(在構建選項中),然後嘗試從項目層次結構的頂部逐一構建項目時,可以找到這種類型的東西 - 如果您看到即使沒有任何變化也可以重建的項目,引用。
  2. 我已將所有項目中的所有「複製總是」文件更改爲「複製更新」。基本上,所有的.csproj文件替換<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  3. 然後我與此PowerShell腳本在this文章描述禁用NTFS隧道:

New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "MaximumTunnelEntries" -Value 0 -PropertyType "DWord"

後,我需要在重建和它似乎現在工作。

+0

非常感謝。步驟3對我來說是不必要的 – Persi 2016-09-14 21:08:44

+0

有沒有一種快速的方法來做到這一點(例如我可以搜索一些特定的文本)?我在VS 2015面臨同樣的問題,我有一個相當大的解決方案文件(包括一些我不允許修改的項目,因爲它們不屬於我)。 – EJoshuaS 2016-11-21 19:26:54

0

經常發生的另一個問題是,解決方案中的某個項目在將來會有一個修改的郵票。如果您向前設置時鐘,然後將時鐘設置爲正確的時間,則會發生這種情況。安裝Linux時發生了這種情況。

在這種情況下,你可以遞歸觸摸使用Git的bash的所有文件(是的,在Windows中):

find . -exec touch {} \;