使用多个 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
。这使得 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 安装 and/or 更新 NuGet 包时,开发人员可以覆盖哪些项目将接收包。根据项目的大小,一些开发人员可能不喜欢创建整体解决方案的想法(即使项目可以右键单击 卸载项目),因为一般性能影响
在我看来,方法 #3 可能更容易,因为一步即可将同一包大量安装到所有项目中。 方法 #1 也很接近,但我担心您会发现由于依赖关系,您将不得不将 NuGet 包部署到其他项目中 - "Type xxx is defined in an assembly that is not referenced. Please add it to references".
不兼容的版本
This leaves proj4's nunit still on v1.0.0, and assuming all binaries are copied to one output folder, the solution that is built first will determine which version of nunit becomes available.
同意,我认为这是最终问题,也是我们 运行 关注的问题。即使你的团队在任何地方都使用 log4net 版本 X,你很有可能会 运行 进入使用某些第三方库也需要 log4net 但版本 [=36] 的情况=]Y。所以版本不兼容的问题又上升了。
AppDomains
如果您发现您的解决方案必须使用多个版本的第 3 方程序集进行部署,您可能需要查看子 .NET AppDomains。这个想法是,您不将程序集部署到一个大文件夹中(旧文件可以被新文件破坏,反之亦然),而是将每个程序集部署到一个根文件夹和子文件夹中,这些程序集绑定到特定的第三方 .dll。
您需要子 AppDomain 的原因是每个 AppDomain 不能多次加载一个程序集,即使其他程序集位于不同的文件夹中也是如此。
例如
<my app folder>
|--folder a
|--log4net v1.dll
|--nunit 3.dll
|--folder b
|--log4net v2.dll
|--nunit 4.dll
毕竟,nUnit 在 运行测试时使用子 AppDomains。
我正在寻找关于哪种方法被认为是最佳实践的一些想法。
场景: .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 安装 and/or 更新 NuGet 包时,开发人员可以覆盖哪些项目将接收包。根据项目的大小,一些开发人员可能不喜欢创建整体解决方案的想法(即使项目可以右键单击 卸载项目),因为一般性能影响
在我看来,方法 #3 可能更容易,因为一步即可将同一包大量安装到所有项目中。 方法 #1 也很接近,但我担心您会发现由于依赖关系,您将不得不将 NuGet 包部署到其他项目中 - "Type xxx is defined in an assembly that is not referenced. Please add it to references".
不兼容的版本
This leaves proj4's nunit still on v1.0.0, and assuming all binaries are copied to one output folder, the solution that is built first will determine which version of nunit becomes available.
同意,我认为这是最终问题,也是我们 运行 关注的问题。即使你的团队在任何地方都使用 log4net 版本 X,你很有可能会 运行 进入使用某些第三方库也需要 log4net 但版本 [=36] 的情况=]Y。所以版本不兼容的问题又上升了。
AppDomains
如果您发现您的解决方案必须使用多个版本的第 3 方程序集进行部署,您可能需要查看子 .NET AppDomains。这个想法是,您不将程序集部署到一个大文件夹中(旧文件可以被新文件破坏,反之亦然),而是将每个程序集部署到一个根文件夹和子文件夹中,这些程序集绑定到特定的第三方 .dll。
您需要子 AppDomain 的原因是每个 AppDomain 不能多次加载一个程序集,即使其他程序集位于不同的文件夹中也是如此。
例如
<my app folder>
|--folder a
|--log4net v1.dll
|--nunit 3.dll
|--folder b
|--log4net v2.dll
|--nunit 4.dll
毕竟,nUnit 在 运行测试时使用子 AppDomains。