【发布时间】:2015-02-26 23:12:44
【问题描述】:
我正在尝试发布和使用类库的版本化 NuGet 包,同时避免本地开发的麻烦。这是一个示例 Visual Studio 解决方案布局:
| Libraries
| LibraryA
| LibraryB
| LibraryC
| Applications
| ApplicationD
| ApplicationE
这是一个包含共享类库和多个应用程序的单一解决方案。当前,应用程序对类库的引用是本地解决方案中的引用。
我想做的是将库(A、B、C)发布为版本化的 NuGet 包,然后应用程序根据需要(D、E)引用这些包。这允许对共享库的更改独立于对已部署应用程序的更新。如果没有这个,更改一个库可能会导致二进制文件在十几个或更多应用程序中发生变化,所有这些都需要在技术上进行测试。这是不可取的,使用 NuGet 进行版本控制可以解决此问题。
但是,假设我想同时更新 LibraryA 和 ApplicationD 的内容。为了在我们切换到 NuGet 后执行此操作,我必须对 LibraryA 进行更改,提交它们,等待创建包,告诉 ApplicationD 更新其对 LibraryA 的引用,然后在 ApplicationD 中进行测试或开发。这比使用本地解决方案中的引用同时使用两者要复杂得多。
有什么更好的方法可以为我的共享类库获得版本化 NuGet 包的稳健性,同时即使跨多个项目和应用程序也能保持开发简单?我发现的唯一其他解决方案都涉及过多的开销或令人头疼的问题,例如必须不断更改 NuGet 包和本地项目之间的 ApplicationD 引用。
编辑:为了澄清前提,这个问题假设如下:
- 架构(解决方案和项目组织)无法进行重大重组
- 共享库将以不平凡的频率发生变化
- 更改共享库不能强制更新任何应用程序
- 应用程序可以引用不同版本的共享库
【问题讨论】:
-
"让我们说我想同时更新 LibraryA 和 ApplicationD 的内容" 如果这是一个问题,那么我强烈建议不要使用 NuGet 包。当程序集足够稳定以至于很少更改并且它们的更改过程与系统的其余部分分开时,应将它们转换为 NuGet 包。
-
@Euphoric 对于如何更新共享 LibraryA,您有什么建议吗?它可以被 50 个独立的应用程序使用,而不必在所有 50 个应用程序上强制使用新版本并触发大量回归测试?您提到的稳定性是一个很好的理想目标,但对于这个用例来说并不实用。当然,我对其他方法/工具持开放态度。
-
我认为您的库不稳定并且依赖于其他 50 个库这一事实是问题所在。最好的方法是重新设计架构以增加稳定性,然后创建一个单独的解决方案,包括它自己的需求、变更请求和开发计划。如果你真的有 50 个应用程序依赖它,那么这不会是那么大的努力。
-
您可以拥有特定于版本的 NuGet 引用。您需要确保共享 LibraryA 具有合理的版本控制方案,并且使用它的每个应用程序都可以在准备好时升级(或不升级)。您只需确保所有版本都可用,就像 nuget.org 一样。
-
@Andrew 是的!引用特定版本的能力是我首先使用 NuGet 解决此问题的原因。
标签: c# visual-studio visual-studio-2013 nuget nuget-package