[英]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
。 这使得proj4
的nunit
仍然在v1.0.0
,并且假设所有二进制文件都复制到一个输出文件夹,首先构建的解决方案将确定哪个版本的nunit
可用。
方法#1:编写一个由a.sln
和b.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.