在這個主題上有很多帖子,但我還沒有找到「真正的」解決方案。如何在Visual Studio/MSBuild中執行依賴關係管理
如何使用MSBuild項目文件(即通過項目和文件引用的Visual Studio項目文件)管理其依賴關係樹(編譯時和運行時)?
衆所周知,如果沒有編譯時引用,即使存在運行時依賴項,並且即使copy-local = true,也不會將子項目的項目引用複製到應用程序bin目錄。因此,任何鬆散耦合的組件都不會被複制。
解決此問題的方法是在copy-local = true的父項目中包含依賴項。然而,這基本上破壞了你的依賴關係樹,因爲你不再知道依賴關係在哪裏,並且隨着你的應用程序的增長和變形,你最終會得到一個DLL地獄版本。你的父項目最終會有10到100個dll,其中大多數是兒童項目中dll的運行時依賴項。
另一個竅門是編寫自定義目標文件並從每個項目文件中調用它:http://blog.alexyakunin.com/2009/09/making-msbuild-visual-studio-to.html。但肯定有更好的選擇。這是一個麪包和黃油的東西。 Java開發人員永遠不必處理這些微不足道的問題。
從我能收集到的信息來看,Microsoft解決這個問題的方法是在每個開發,測試和生產機器上註冊GAC的每個依賴項。但這是愚蠢和煩人的。我不會費心提供這個選項和教育反駁。
避免GAC選項,如何使用MSBuild來管理依賴關係樹,該依賴關係樹只包含僅運行時依賴關係?微軟如何做到這一點?當然,他們不會像上面的鏈接那樣運行自定義目標文件。
我希望來自企業.NET背景的人可以加強並提供一些真正的建議。否則,我將不得不重寫我在NAnt中的所有構建腳本(不寒而慄)。
謝謝大家。
UPDATE
在迴應一些評論,以下是從我的當前項目問題的一個實際的例子。
該應用程序是一個Web應用程序項目,公開了一套WCF服務。它具有包含外部服務類的外部域DLL以及包含內部服務POCO,域對象和DAO的內部域DLL。有一個單獨的集成DLL包含所有內部域類的接口(DTO),這些接口允許我們完全分離外部和內部域。整個事情與Spring.net聯繫在一起。我希望這是清楚的,讓我知道你是否需要更多的澄清。
我目前的構建過程是使用MSBuild爲Web應用程序(在TFS Build中)生成部署包。因此,儘管整個解決方案是最初構建的,但只有來自Web應用程序的輸出才能打包。因此,Web應用程序被視爲依賴項根,並且我期望任何鬆散耦合的子引用應該在構建時拷貝過來,如果它們被設置爲'copy-always = true'的話。
因此,Web應用程序包含對外部域DLL的引用,其中包含對內部域DLL的引用,其中包含對第三方庫的許多引用以及第三方庫所需的各種間接和鬆散耦合的依賴關係。
當內部域DLL中存在第三方依賴關係時會出現問題,例如在運行時NHibernate需要的oracle.dataaccess。即使在這些DLL上設置'copy-always = true',它們也不會被複制到Web App包中。我可以將它們包含在包中的唯一方法是將這些DLL添加到Web應用程序的引用中。我不想這樣做,因爲我不再有一個有意義的依賴關係樹。
我希望這可以讓問題更清楚。請讓我知道,如果有什麼不清楚。很難形容這種東西。
如果有人也有類似的問題,請說出來,分享您的經驗。
是的,我同意你將它們添加到GAC的效率會很低,但我只是好奇NAnt在這種情況下會如何幫助你更多?另外在Java開發中如何處理這種情況?我想更多的線索,以便我可以給你更好的答案...謝謝 –
我認爲他想要的東西就像Java中的maven。實際上我也在尋找類似的東西。 http://maven.apache.org/ –
在反思中,我認爲NAnt會導致更多的問題。我將用一個具體的問題示例更新原始帖子。 –