|
因此,开发人员通常得自己动手解决问题,他们目前已经编写了成千上万的实用库,并将其发布到 Web 上。 访问多家公司后,您将发现他们拥有比例非常高的内部日志记录库,而这些库中有一些非常不错,例如,Log4Net、NLog 和 Error Logging Modules and Handlers(即 ELMAH)。 如何将库集成到当前项目中并管理库的依赖项和更新呢? 假设您刚刚听说 ELMAH 并希望在下一个项目中使用它。 您可能会采取下列步骤:
当您的应用程序要发布新版本时,您需要花费大量时间为应用程序的依赖项搜索更新。 “非我发明”(NIH) 过去常常遭到非议,而在现在听起来却是不错的主意。 NuGet 应运而生nupkg,使用开放打包约定 (OPC) 格式。 nupkg 文件同样如此。 之后,我将讲述如何创建和发布程序包。 安装 NuGet单击“Download”(下载)按钮安装 NuGet。
ASP.NET MVC 3 包含 NuGet,并且 Microsoft 计划在下一版本的 Visual Studio 中包含 NuGet。 安装程序包NuGet 同样内置基于 Windows PowerShell 的控制台,此控制台面向高级用户(将在下文提及)。 图 2 中所示。
请确保选中“Online”(联机)选项卡,并在右上角输入搜索词(例如,搜索来自 StackOverflow.com 的实用库 MiniProfiler)。 NuGet 随后下载该程序包和它的依赖项,并将任何必要更改应用到程序包指定的项目中。 NuGet 执行下列步骤安装程序包:
很多程序包使用 WebActivator 程序包自行激活,从而最小化安装后所需的任何配置。 您可以卸载程序包,这将使项目回到安装程序包之前的状态。 更新程序包因此,维护可能是软件生命周期中最重要的阶段。” 这需要您回答一个问题:“此项目中的哪些依赖项有可用的最新更新?” 单击“Update”(更新)按钮可将程序包更新到最新版本。
更新命令卸载旧程序包,然后安装新程序包,确保所有依赖项都根据需要得到更新。 NuGet 在程序包管理器控制台中提供便于控制更新的命令,例如,用以更新解决方案中的所有程序包或执行“安全”更新。 面向高级用户的 NuGet这些开发人员将命令行 shell 视作 UI,他们更愿意通过这些 shell 组成命令集。 Windows PowerShell 是基于 .NET 的脚本语言和命令行 shell,非常适合组成命令集,并能够处理对象。 要启动程序包管理器控制台,请导航至“Tools”(工具)|“Library Package Manager”(库程序包管理器)|“Package Manager Console”(程序包管理器控制台)菜单选项。 列出和安装程序包下列命令行搜索所有包含“MVC”的程序包: Get-Package -ListAvailable -Filter Mvc 例如,要将 ELMAH 安装到当前项目: Install-Package Elmah Tab 扩展等同于 C# 的 IntelliSense,但与基于编译时信息的 IntelliSense 不同,您可以在运行时填充 Tab 扩展。 图 4 所示。
更新程序包例如,无需参数即可调用此命令以更新解决方案的每个项目中的各程序包: Update-Package 因此,如果您有 1.0 版本的程序包,而 1.1 和 2.0 版本在该程序包源中可用,则该命令将此程序包更新至最新的 2.0 版本。 仅添加 Safe 标记以执行安全更新,例如: Update-Package -Safe 在这种情况下,如果您安装了 1.0.0 版本的程序包,而 1.0.1 和 1.1 版本在该程序包源中可用,则该程序包将安全地升级至 1.0.1 而非 1.1。 Update-Package 命令还提供更精细的控制,例如,将程序包更新至特定版本而非最新版本。 用新命令扩展 Visual Studio这些命令能够与 Visual Studio DTE 交互以执行各种任务。 图 5 所示。
您的组织中的 NuGet由于用户仅关注 NuGet 如何简化与公共开发人员社区共享库,用户通常很容易忽视 NuGet 在企业中的作用。 有些组可能会完全无视这些库,而是从头自己编写。 听起来是不是很熟悉? 程序包来源nuget.org/v1/FeedService.svc。 OData 格式使 NuGet 客户端能够在客户端上生成搜索程序包源的特定查询,但是会在服务器上执行这些查询。 图 6 所示。
这样一来,只需将代码放入一个文件夹即可与他人共享,并且在测试您自己创建的程序包时同样有用。 托管您自己的 NuGet 服务器除了在网络共享上托管程序包之外,您还可以将网站设置为程序包源,使用网站与组织中的其他人共享程序包。 此程序包将简单的 OData 端点添加到空 Web 应用程序中。 有关如何设置的详细信息,请参阅 NuGet 的文档站点 bit.ly/jirmLO。 如果您希望部署类似 nuget.org 的完整库体验,NuGet 库代码还可通过 nugetgallery.codeplex.com 项目作为开放源项目提供。 通过托管专用 NuGet 服务器或库实施,您可以方便地在公司内部共享专有代码,无需公开发布。 创建程序包您可以在 npe.codeplex.com 下载该应用程序。 NuGet.exe我针对此类实用工具创建了一个名为“utils”的文件夹。 如果出现更新的版本,仅需运行以下命令,NuGet 即会联机检查并自行更新至最新版本: nuget update –self 例如,要搜索带“MVC”的所有程序包,可使用以下命令: nuget list Mvc NuGet.exe 甚至能够下载程序包和依赖项并解压缩它们,但它不能将项目修改为引用已下载的程序包程序集或运行程序包中包含的任何 Windows PowerShell 脚本。 从项目创建程序包此部分讲述使用 NuGet.exe 针对项目文件(例如,.csproj 或 .vbproj 文件)创建上述程序包的简单流程。 nuget.org 的 NuGet 文档网站。 创建程序包的基本步骤:
创建程序包后,务必打开 AssemblyInfo.cs 文件以更新程序集的元数据。 确保在项目文件所在目录中运行命令: nuget spec 图 7 中所示。 图 7:生成的 NuSpec 文件 请勿编辑包含占位符的字段,但应在其他字段(例如,licenseUrl、projectUrl、iconUrl 和 tags)中填入正确的值。 NuGet 能够读取这些程序集元数据并在创建程序包时将其合并到 NuSpec 清单,从而确保了此信息始终在您的程序包和程序集中保持同步。 图 8 中的表显示了程序集元数据和 NuSpec 占位符值之间的对应关系。 图 8:映射到 NuSpec 的程序集元数据
与其他字段不同,$id$ 字段并非从程序集属性提取,而是设置为程序集名称。 创建程序包。在项目文件和 NuSpec 文件所在目录中,运行以下命令以创建程序包: nuget pack ProjectName.csproj 如果同一个目录中只有一个项目文件,则在运行命令时可以省略项目文件名称。 这将在运行 pack 命令之前编译项目: nuget pack ProjectName.csproj -Build 您可以在操作后使用 Package Explorer 检查程序包,以确保创建正确。 为了方便开发人员安装您的程序包,请考虑使用 Symbols 标记创建带调试器符号的程序包: nuget pack ProjectName.csproj -Build -Symbols 这使安装您的程序包的其他人在调试其应用程序时能够单步执行程序包代码。 发布程序包发布之前,您需要在 nuget.org 上创建一个帐户。 此密钥非常重要,因为向 nuget.exe 命令标识库,并且是可撤消的密码。 一旦拥有自己的密钥后,请使用以下命令将其存储在安全的位置: nuget setApiKey b688a925-0956-40a0-8327-ff2251cf5f9a 存储密钥后,使用 push 命令将您的程序包发布到库: nupkg 如果您创建了前述符号程序包,则应在对程序包执行 push 命令时指定 Symbols 标记: nupkg -Symbols 此命令将主程序包推送到 NuGet 库,并将符号程序包推送到合作伙伴的 symbolsource.org 存储库。 后序在企业内部,NuGet 可用于在组织中的不同开发人员之间共享代码。 NuGet 支持 Windows Phone、Silverlight、Windows Presentation Foundation 以及其他项目类型,并将在今后支持新的项目类型。 该项目属于 Outercurve Foundation,但已集成到 Microsoft 的产品,并且若干 Microsoft 开发人员已成为它的核心参与者。 若希望帮助 NuGet 的开发,请访问 nuget.codeplex.com 以了解如何参与其中以及如何对 NuGet 做出贡献。 开发团队积极参与 CodePlex 讨论论坛中有关 NuGet 项目的讨论,并欢迎您提出有关问题。 是 Microsoft ASP.NET 团队的高级项目经理,专注于为开发人员创建优秀的产品。他参与 ASP.NET 很多领域的工作,他的主要项目是 ASP.NET MVC 和 NuGet 程序包管理器,这两个产品均通过 OSS 许可证发布。在工作之余,他会在博客 (haacked.com) 上写有关软件的文章,并研究 Subtext 开放源码博客引擎。 David Fowler |
相关文章: