2013-02-13 84 views
3

我有許多項目的應用程序。 我有時會發現我必須刪除dll,並在整體清理編譯之前重新編譯每個項目。 我還發現,當我做一個構建時,我必須記得檢查每個項目的存儲在bin文件夾中的dll,編譯每個項目,檢查dll,然後運行構建以獲得乾淨的編譯。 這很麻煩。 我只想爲我做的任何更改重建一次,以及何時發佈。 那我該如何解決呢?MVC:需要用多個項目構建我的應用程序

+1

+1這個真棒問題... – 2013-02-13 15:46:31

+0

我不知道我明白。我有很多包含混合第三方和本土DLL的項目的解決方案,從來沒有遇到過問題。除非您正在對這些DLL進行更改,否則您不應「檢出」靜態DLL以進行編譯。如果您正在對DLL進行更改,那麼爲什麼要直接引用這些DLL而不是項目引用? – jmrnet 2013-02-13 16:00:10

+0

第三方DLL在lib文件夾中,這不是問題。我發現爲了編譯我的應用程序,我必須將每個項目的dll複製到我的主項目的bin目錄中。也許有另一種更好的方式來做到這一點?我懷疑有。 – arame3333 2013-02-13 16:04:32

回答

1

我們在我工作的公司中遇到過這個問題,我們仍在努力清理所有問題。

我要做的第一個建議是沒有項目引用到您的解決方案中的通用庫。你說你的項目的bin文件夾中有一些inhouse dll。你要問自己:

  • 特定於該解決方案
  • 或者這些DLL,是他們共同的庫,你將再次使用

如果是前者,那麼我建議你有一個動態鏈接庫作爲解決方案中的項目來源。在Visual Studio中正確設置構建順序,重建解決方案將確保一切都得到一個乾淨的構建。

但是,如果它是後者,並且您將在其他解決方案中重用這些dll,那麼它們應該在他們自己的解決方案中。理想情況下,使用諸如Cruise Control之類的構建服務器或類似的東西。這將允許您對通用庫進行更改,並且只要您正確設置,它就會自動使用新版本號重新編譯它。然後,一旦您的公共圖書館通過了測試,並且您很高興將其發佈,請將其放入正在處理的項目中的「bin」或「Dependencies」文件夾中。如上例所示,引用該dll而不是Project。當你建立你的項目時,它將在編譯時使用bin/Dependencies文件夾中的dll。

這樣做的好處是,如果您在一個解決方案中使用通用庫並將其發佈到客戶端或作爲項目,然後更改通用庫併發布新的客戶端解決方案/產品,您將確切知道哪個版本共用庫正在使用中。然後,你可以去你的源代碼管理並提取確切的代碼。

我們正在使用一些產品,並使用我們實施的每個客戶端解決方案進行有效增長。在十幾個項目之後,我們不知道每個客戶端正在運行的代碼版本。自從我們轉移到與Mercurial聯合的Cruise Control for SSC以來,我們現在清楚地知道我們的所有產品和客戶端解決方案正在使用的代碼版本。

+0

我發現Nuget下載的每個項目的每個版本都沒有被拾取。所以我在每個項目中創建了一個lib文件夾並將它們複製到那裏。這確實留下了Nuget更新的問題,不知道將來如何解決這個問題。你對構建順序的建議也有幫助,所以我給你打勾。 – arame3333 2013-02-15 08:25:01

1

很難確切地知道你需要什麼來解決你的具體問題,沒有更多的細節,但這些技巧應該有很大的幫助。

當我做了構建我要記得籤每個 項目,該項目被存儲在bin文件夾

首先所有的dll文件,不要將您的bin文件夾內容存儲在源代碼控制。相反,只有在需要與某人共享時才發佈構建,並將其放在源控制系統的不同位置。這是一個可以這樣工作的文件夾結構的例子。

-MyProduct - 主 ---- SRC ----斌< <在 沒有檢查----等等 - 配送 --MyProject ----版本號 ------明確公佈的dll

我已經刪除了的DLL並重新編譯每一個項目之前,我得到一個整體的全新的編譯。

有時發生這種情況。在Visual Studio中使用重建解決方案命令。

如果您使用文件引用而不是項目引用,則會導致此問題更頻繁發生的問題。使用項目參考。看到這個問題的上的詳細信息:

Project Reference Vs File Reference?

如果您不能使用項目引用出於某種原因,你可以手動更改解決方案的構建順序,並建立依賴關係項目之間更好的更新。

+0

當我從bin目錄中的源代碼控制中刪除項目dll時,發佈版本將無法找到它們。我知道我應該給你更多的信息繼續下去,但我想不出什麼。 – arame3333 2013-02-13 16:32:50

+0

所以,你需要解決這個問題。您的發佈版本不應該依賴於正在簽入您的版本的dll。很可能你們不得不在這個問題上「剝洋蔥」幾次。 – tallseth 2013-02-13 17:54:24

1

我有時會發現我已經刪除了的DLL並重新編譯每個項目 之前,我得到一個整體的全新的編譯。

右鍵單擊解決方案> Clean Solution。然後重新構建。這通常會清除奇怪的構建錯誤。

我也發現當我做了構建我記得要簽出的DLL中存儲的bin文件夾中的每個項目的 ,編譯每個 項目,在DLL檢查,然後運行構建得到編譯一個乾淨的 。

這很可能是真正的問題。不要將外部DLL直接添加到垃圾箱。相反,在解決方案的根添加任何第三方的DLL到一個文件夾,還是真的,其他任何地方,你可以訪問,但我找了根的好去處:

- Solution Folder 
    - ExtLib (place all your 3rd party assemblies here; use sub-folders if needed) 
    - Project A 
    - Project B 
    - MySolution.sln 

然後,參照每個項目增加從您的ExtLib需要:添加引用>瀏覽:根據需要添加dll。

一旦添加了dll,確保它們被標記爲「複製本地」:References>右鍵單擊程序集:複製Local = True。

如果需要引用的程序集位於相關項目中,則只需添加項目引用;無需複製本地VS作爲您的照顧。

通過上述操作,您可以將第三方程序集保存在ExtLib文件夾中,並根據需要添加到源代碼管理中。然後,每當有人從源代碼管理中拉下項目,他們就會拿起ExtLib文件夾和任何更新的程序集。無論何時構建,程序集都會從ExtLib中引用並複製到bin。正如其他人所提到的,千萬不要永遠把你的bin文件夾添加到源代碼控制:YMMV。

+0

謝謝你。我需要一些澄清。當我想到第三方dll時,我正在考慮以Elmah或EntityFramework爲例。我已經把它們放在一個獨立的庫中,並且工作正常。但是項目A,項目B等的dll呢?我已經把它們放在bin目錄中,但正如我之前提到的,如果我檢查它們,我只能成功發佈版本。 – arame3333 2013-02-14 09:43:53

+0

我從來沒有使用過乾淨的解決方案選項,因此對於+1來說,它非常有用 – arame3333 2013-02-14 09:45:29

+0

項目A,B等...被添加爲項目參考。右鍵單擊參考>添加參考>添加項目。這假定項目是現有解決方案的一部分。否則,將它們視爲任何其他第三方DLL。 – 2013-02-14 14:20:57

相關問題