簡體   English   中英

使用多個 VS 解決方案和多個項目時的 NuGet 策略

[英]NuGet strategy when working with multiple VS solutions and multiple projects

我正在尋找關於哪種方法被認為是最佳實踐的一些想法。

場景:.NET SVN 存儲庫由多個項目組成,其中一些項目共享相同的 NuGet 包。 多個解決方案文件也存在,每個文件中都有一個項目子集,有些重疊。

例子:

a.sln
--> proj1 - log4net, nunit(v1.0.0)
--> proj2 - log4net, json
--> proj3 - log4net, nunit(v1.0.0)

b.sln
--> proj2 - log4net, json
--> proj4 - nunit(v1.0.0)

當開發者打開的問題棱a.sln並更新nunit(v1.0.0)該解決方案中的所有項目的說,包v2.0.0 這使得proj4nunit仍然在v1.0.0 ,並且假設所有二進制文件都復制到一個輸出文件夾,首先構建的解決方案將確定哪個版本的nunit可用。

方法#1:編寫一個由a.slnb.sln使用的項目,唯一目的是包含所有項目的所有 NuGet 引用,並將所有文件輸出到一個文件夾,例如Externals 修改所有項目以手動引用此文件夾中的dll

方法#2:在更新包時要勤奮,並為每個解決方案重復該過程。

方法#3:創建一個包含所有項目的解決方案並避免多個解決方案。

我有強烈的偏好,但希望獲得社區反饋並保持開放的態度。

  • 方法#1 - 我看到的問題是它強制更新到其他項目,導致潛在的編譯問題。 此外,您可能有一個更喜歡舊 NuGet 包的項目

  • 方法#2 - 根據#1,此外,除非開發人員使用其他解決方案,否則他們可能不會考慮更新它們。 我們的開發人員在處理帶有眼罩的錯誤時可能會很挑剔

  • 方法#3 - 盡管從維護的角度來看稍微容易一些,但它並不能保證某些項目都使用相同的 NuGet 數據包。 例如兩個不同版本的nunit 在 Visual Studio 中安裝和/或更新 NuGet 包時,開發人員可以覆蓋將接收包的項目。 根據您的項目大小,由於一般性能影響,一些開發人員可能不喜歡創建整體解決方案的想法(即使項目可以右鍵單擊Unload Project

在我看來,方法 #3可能更容易,因為可以通過一步將相同的包批量安裝到所有項目中。 方法 #1也很接近,但我擔心你會發現你將不得不將 NuGet 包部署到其他項目中,而不管依賴項 - “類型 xxx 是在未引用的程序集中定義的。請將其添加到參考”

不兼容的版本

這使得 proj4 的 nunit 仍然在 v1.0.0 上,並且假設所有二進制文件都復制到一個輸出文件夾中,首先構建的解決方案將確定哪個版本的 nunit 可用。

同意,這在我看來是終極問題,也是我們遇到的問題。 即使您的團隊在任何地方都嚴格使用 log4net 版本X ,但您很有可能會遇到使用某些第三方庫也需要 log4net 但版本Y 的情況 所以版本不兼容的問題又出現了。

應用程序域

如果您發現您的解決方案必須與多個版本的 3rd 方程序集一起部署,您可能需要查看子 .NET AppDomains。 這個想法是你不是將你的程序集部署到一個大文件夾中(舊文件可以被新文件破壞,反之亦然),而是每個程序集綁定到特定第三方 .dll 的根文件夾和子文件夾。

您需要子 AppDomains 的原因是,即使其他程序集位於不同的文件夾中,每個 AppDomain 的程序集也可能不會加載多次。

例如

<my app folder>
|--folder a
  |--log4net v1.dll
  |--nunit 3.dll
|--folder b
  |--log4net v2.dll
  |--nunit 4.dll

畢竟,nUnit 在運行測試時使用子 AppDomains。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM