繁体   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