8

我知道当我们想使用第三方组件时,像 NuGet 这样的包管理器会帮助我们。

从 Nuget Codeplex 页面:

NuGet 是一个免费的、开源的、专注于开发人员的包管理系统,用于 .NET 平台,旨在简化在开发过程中将第三方库合并到 .NET 应用程序中的过程。

.NET 平台上有大量有用的第 3 方开源库,但对于那些不熟悉 OSS 生态系统的人来说,将这些库拉到一个项目中可能会很痛苦。

让我们以ELMAH为例。这是一个很好的错误记录实用程序,它不依赖于其他库,但集成到项目中仍然是一个挑战。这些是它采取的步骤:

Find ELMAH
Download the correct zip package.
“Unblock” the package.
Verify its hash against the one provided by the hosting environment.
Unzip the package contents into a specific location in the solution.
Add an assembly reference to the assembly.
Update web.config with the correct settings which a developer needs to search for. 

这是一个没有依赖关系的库。想象一下为 NHibernate.Linq 这样做,它有多个依赖项,每个依赖项都需要类似的步骤。我们可以做得更好!

NuGet 自动执行包及其依赖项的所有这些常见且繁琐的任务。它消除了将第三方开源库合并到项目源代码树中的几乎所有挑战

这些步骤是我们要设置项目时执行的简单任务。它仅用于自动添加 3rd 方组件并确定配置文件中出错的机会?或者它有更多的责任!?

4

2 回答 2

19

它的价值隐藏在公开之中:像 NuGet 这样的包管理器可以帮助您使用自动化处理软件依赖关系。许多人假设它仅适用于开源或第三方组件,但您同样可以将其用于您自己的内部包。

NuGet 的优点是(仅举几例):

  • NuGet 鼓励重用组件,因为您隐式依赖实际的“发布”(即使是预发布),而不是分支源
  • 您可以摆脱使 VCS 存储库膨胀的二进制文件(包还原功能)
  • 它迫使包创建者考虑使用包的方式,并让他们在包安装期间处理组件的配置(谁比包创建者最了解如何配置包?)。以 ELMAH 为例。
  • 有效地在包存储库上自动创建和发布包是持续交付的一种形式(对于软件组件)。OctopusDeploy 甚至更进一步,可以打包整个网站以供部署。
  • NuGet 鼓励并且有时会强制您遵循一些 ALM 最佳实践。例如,一个包有一个版本,所以你必须考虑你的版本控制策略(例如 SemVer.org)
  • NuGet 与 SymbolSource.org 集成(它也有一个社区版来设置你自己的):这允许人们轻松调试已发布的包,而无需一直发送此信息
  • 拥有一个或多个包存储库使组织可以轻松维护依赖关系矩阵,甚至构建多个项目正在使用的 OSS 许可证清单
  • NuGet 通知你可用的包更新
  • 创建包让人思考组件架构(所有依赖项也应该打包)
  • 包的依赖关系会自动解析(所以你不能忘记任何)
  • NuGet 足够聪明,可以在需要时添加程序集绑定重定向

上面的列表并不详尽,但我希望我涵盖了这个答案中的主要好处。我敢肯定还有更多。

干杯,泽维尔

于 2012-10-22T05:13:30.677 回答
3

使用NuGet的原因是您不必交付项目中的所有库,从而减少项目大小。使用 NuGet Power Tools,通过在Packages.config文件中指定包版本,您将能够在首次运行项目时下载所有必需的库。

Live Exapmle:在部署项目时减少项目大小很重要。就像解决方案有 500Mb 的代码和 200Mb 的包大小,那么每次上传项目的额外费用为 200mb。我们只需在包中设置它们的引用,而不是上传具体的 dll 文件.config 文件。

于 2016-06-13T09:33:43.073 回答